2009-12-01 9 views
7

Ich schreibe eine Anwendung, die den Master/Slave-Schalter innerhalb der Anwendungsschicht passieren muss. Wie es jetzt ist, instanziiere ich ein Zend_Db_Table-Objekt bei der Erstellung des Mappers und setze dann DefaultAdapter auf den Slave.Master/Slave-Schalter in der Zend Framework-Anwendungsschicht

nun innerhalb des Basis-Mapper classe, habe ich folgendes Verfahren:

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

Ich brauche eine Plausibilitätsprüfung zu diesem Thema. Ich denke nicht, dass der Overhead zu viel ist, ich vermute nur, dass es einen besseren Weg geben muss.

Antwort

3

Ein Objekt vom Typ Zend_Db_Table_Row_Abstract erinnert, was Table-Objekt es produziert. Sie können jedoch die verknüpfte Tabelle ändern, bevor Sie save() aufrufen.

$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

Wie wäre es mit etwas wie einer Basisklasse, die Sie erweitern, die den Start durchführt?

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

Ich müsste immer noch in der Lage sein, den DB-Adapter im laufenden Betrieb zu wechseln, also bin ich mir nicht sicher, ob das funktionieren würde. – Pro777

0

Obwohl Sie wahrscheinlich schon kam mit einer Lösung fand ich immer noch die Art und Weise poste ich es tat: Ich war für eine Suche Lösung für das gleiche Problem und kam auf die Idee, die Logik dafür in den Adapter zu setzen.

Ich erweiterte die Zend_Db_Adapter_Abstract und fügte das boolesche Attribut $ writes hinzu. Ich habe auch öffentliche Getter- und Setter-Methoden hinzugefügt.

Mein Adapter speichert zwei verschiedene Datenbankkonfigurationen/-verbindungen: eine für den Master (zum Schreiben) und eine für den Slave (zum Lesen). (Eigentlich ist es nicht eine Konfiguration, aber viele, so habe ich eine Art Pool von Meistern und Salben, die nach dem Zufallsprinzip ausgewählt werden.)

Jetzt mache ich folgendes: Bevor ich eine Abfrage ausführen $ müssen auf True oder gesetzt werden falsch. In der Methode connect() verbindet oder verwendet der Adapter die richtige Verbindung abhängig vom Wert von $ writes.