Question

Je suis en train d'écrire une application qui nécessite le commutateur maître / esclave pour arriver à l'intérieur de la couche d'application. Comme il est en ce moment, j'instancier un objet Zend_Db_Table sur la création du cartographe, puis setDefaultAdapter à l'esclave.

maintenant à l'intérieur de la base mappeur classe, j'ai la méthode suivante:

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

J'ai besoin d'une vérification raisonnable à ce sujet. Je ne pense pas que les frais généraux est trop, je pense que il doit y avoir une meilleure façon.

Était-ce utile?

La solution

Un objet de type Zend_Db_Table_Row_Abstract se souvient quel objet de table a produit. Mais vous pouvez changer la table associée avant d'appeler 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();

Autres conseils

Que diriez-vous quelque chose comme une classe de base que vous étendez qui effectue le démarrage?

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

Bien que vous très probablement déjà venu avec une solution que je vais encore poster la façon dont je l'ai fait: Je cherchais une solution pour le même problème et est venu avec l'idée de mettre la logique pour cela dans l'adaptateur.

Je tendis la Zend_Db_Adapter_Abstract et a ajouté l'attribut booléen écrit $. J'ai ajouté getter public et setter pour elle aussi.

Mon adaptateur enregistre deux configurations de base de données / -Connexions différentes: une pour le maître (pour l'écriture) et une pour l'esclave (pour la lecture). (En fait, ce n'est pas une configuration mais beaucoup donc je sorte d'une piscine de maîtres et baumes qui sont choisis au hasard en poids.)

Maintenant, je fais ce qui suit: Avant l'exécution d'une requête de $ écrit doit être réglé sur vrai ou faux. Dans la méthode connect () l'adaptateur se connecte ou utilise la bonne connexion en fonction de la valeur de $ écrit-il.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top