2009-12-01 19 views
7

Uygulama katmanında Master/Slave anahtarının olmasını gerektiren bir uygulama yazıyorum. Şu anda olduğu gibi, bir Zend_Db_Table nesnesini eşleştiricinin oluşturulmasında ve sonra da slave'ye setDefaultAdapter öğesini başlatıyorum.Zend Framework uygulama katmanında Master/Slave anahtarı

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); 
    } 
} 

Bu konuda Sağlık denetimi gerekir:

Şimdi baz mapper classe iç, ben aşağıdaki yöntemi var. Genel giderlerin çok fazla olduğunu sanmıyorum, daha iyi bir yol olması gerektiğinden şüpheleniyorum.

cevap

3

tip Zend_Db_Table_Row_Abstract bir amacı Tablo nesne onu üreten hatırlar. Ancak, save()'u aramadan önce ilişkili Tabloyu değiştirebilirsiniz. Bir arıyordu:

$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

nasıl başlangıç ​​performans gösterdiğini uzatmak bir taban sınıfı gibi bir şey?

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

DB adaptörünü anında değiştirmem gerekiyor, bu yüzden işe yarayıp yaramadığından emin değilim. – Pro777

0

büyük olasılıkla zaten bir çözüm geldi rağmen hala ben yaptım şekilde yayınlayacağız cevap verecektir düşünüyorum this article bulduk Aynı problem için çözüm ve bunun mantığını Adaptöre koyma fikri ortaya çıktı.

Zend_Db_Adapter_Abstract öğesini genişlettim ve boolean özniteliği $ yazdıklarını ekledim. Bunun için kamu getiri ve ayarlayıcı yöntemleri de ekledim.

Bağdaştırıcım, iki farklı veritabanı yapılandırması/bağlantısı kaydeder: bir tanesi ana (yazma için) ve bir tanesi için (okuma için). (Aslında bir konfigürasyon değil, birçoğu da ben rasgele bir şekilde ağırlıkla seçilebilen masters ve salves havuzuna sahibim.)

Şimdi aşağıdakileri yaparım: Bir sorgulamadan önce $ writes true değerine ayarlanmalı veya yanlış. Connect() yönteminde, bağdaştırıcı $ yazarlarının değerine bağlı olarak doğru bağlantıyı bağlar veya kullanır.