Frage

Ich schreibe eine Anwendung, die den Master / Slave-Schalter erfordert in der Anwendungsschicht passieren. Wie es jetzt ist, instanziieren ich ein Zend_Db_Table Objekt bei der Erstellung des Mapper, und dann setDefaultAdapter an den Slave.

Nun innerhalb der Basis Mapper classe, ich habe die folgende Methode:

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 glaube nicht, der Aufwand zu groß ist, ich vermute, dass es nur muss ein besserer Weg geben.

War es hilfreich?

Lösung

Ein Objekt vom Typ Zend_Db_Table_Row_Abstract erinnert, was Table-Objekt es produziert. Aber man kann die zugehörige Tabelle ändern, bevor Sie save() nennen.

$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();

Andere Tipps

Wie wäre es so etwas wie eine Basisklasse, die Sie erweitern, welche den Start fü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

Auch wenn Sie wahrscheinlich schon mit einer Lösung kam ich Post immer noch so, wie ich es tat: Ich suchte nach einer Lösung für das gleiche Problem suchen und kam auf die Idee, für die in den Adapter, die Logik zu setzen.

ich die Zend_Db_Adapter_Abstract erweitert und hinzugefügt, um das Boolesche Attribut $ schreibt. Ich fügte hinzu, öffentliche Getter und Setter-Methoden für sie als gut.

Mein Adapter speichert zwei verschiedene Datenbank-Konfigurationen / -Anschlüsse: ein für den Master (zum Schreiben) und ein für den Slave (zum Lesen). (Eigentlich ist es nicht eine Konfiguration aber viele so habe ich Art von einem Pool von Meister und Salben, die zufällig Gewichts ausgewählt werden.)

Jetzt mache ich folgendes: Bevor ich eine Abfrage $ schreibt ausführen muss, um richtig oder falsch eingestellt werden. Bei dem Verfahren connect () der Adapter verbindet oder verwendet die richtige Verbindung je nach dem Wert von $ schreibt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top