2009-12-01 10 views
7

मैं एक आवेदन लिख रहा हूं जिसके लिए आवेदन परत के अंदर मास्टर/स्लेव स्विच होना आवश्यक है। चूंकि यह अभी है, मैं मैपर के निर्माण पर एक Zend_Db_Table ऑब्जेक्ट को तुरंत चालू करता हूं, और उसके बाद दास को setDefaultAdapter सेट करता हूं।ज़ेंड फ्रेमवर्क अनुप्रयोग परत में मास्टर/स्लेव स्विच

public function useWriteAdapter() 
{ 
    if(Zend_Db_Table_Abstract::getDefaultAdapter() != $this->_writeDb) 
    { 
     Zend_Db_Table_Abstract::setDefaultAdapter($this->_writeDb); 
     $this->_tableGateway = new Zend_Db_Table($this->_tableName); 
    } 
} 

मैं इस पर एक मानसिक स्वास्थ्य की जांच की जरूरत है:

अब आधार नक्शाकार classe के अंदर, मैं निम्न विधि है। मुझे नहीं लगता कि ओवरहेड बहुत अधिक है, मुझे संदेह है कि एक बेहतर तरीका होना चाहिए।

उत्तर

3

प्रकार Zend_Db_Table_Row_Abstract की एक वस्तु याद रखता है कि टेबल वस्तु का उत्पादन किया। लेकिन आप save() पर कॉल करने से पहले संबंधित तालिका को बदल सकते हैं। मैं एक के लिए देख रहा था:

$readDb = Zend_Db::factory(...); // slave 
$writeDb = Zend_Db::factory(...); // master 
Zend_Db_Table::setDefaultAdapter($readDb); 

$myReadTable = new MyTable(); // use default adapter 
$myWriteTable = new MyTable($writeDb); 

$row = $myTable->find(1234)->current(); 

$row->column1 = 'value'; 

$row->setTable($myWriteTable); 

$row->save(); 
1

आपके द्वारा विस्तारित बेस क्लास की तरह कुछ कैसे शुरू होता है जो स्टार्टअप करता है?

class My_Db_Table extends Zend_Db_Table 
{ 
    function init() 
    { 
     if (....) { 
      // set the default adaptor to the write-DB-master 
     } 
     parent::init(); 
    } 
} 
// all your models then extend My_Db_Table instead of Zend_Db_Table 
+0

मुझे अभी भी फ्लाई पर डीबी एडाप्टर स्विच करने में सक्षम होना चाहिए, इसलिए मुझे यकीन नहीं है कि यह काम करेगा या नहीं। – Pro777

0

यद्यपि आप सबसे शायद पहले से ही एक समाधान के साथ आया था मैं अभी भी जिस तरह से मैंने किया पोस्ट करेंगे जवाब देंगे पाया है एक ही समस्या के लिए समाधान और एडाप्टर में इसके लिए तर्क डालने के विचार के साथ आया।

मैंने Zend_Db_Adapter_Abstract बढ़ाया और बूलियन विशेषता $ लिखने को जोड़ा। मैंने इसके लिए सार्वजनिक गेटर और सेटर विधियों को भी जोड़ा।

मेरा एडाप्टर दो अलग-अलग डेटाबेस-कॉन्फ़िगरेशन/-कनेक्शन सहेजता है: एक मास्टर के लिए (लेखन के लिए) और दास के लिए एक (पढ़ने के लिए)। (असल में यह एक कॉन्फ़िगरेशन नहीं है, लेकिन बहुत से मेरे पास मास्टर्स और सॉल्व का एक पूल है जो वजन से यादृच्छिक रूप से चुने जाते हैं।)

अब मैं निम्न कार्य करता हूं: एक क्वेरी निष्पादित करने से पहले $ लिखने को सत्य पर सेट किया जाना चाहिए या असत्य। विधि कनेक्ट() एडाप्टर $ लिखने के मूल्य के आधार पर सही कनेक्शन को जोड़ता है या उपयोग करता है।