Domanda

Sto scrivendo un'applicazione che richiede l'interruttore Master / Slave per accadere all'interno del livello di applicazione. Perché è proprio ora, un'istanza di un oggetto Zend_Db_Table sulla creazione del mappatore, e poi setDefaultAdapter allo slave.

Ora, all'interno della classe di base mapper, ho il seguente metodo:

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

Ho bisogno di un controllo di integrità su questo. Non credo che il sovraccarico è troppo, ho solo il sospetto che ci deve essere un modo migliore.

È stato utile?

Soluzione

Un oggetto di tipo Zend_Db_Table_Row_Abstract ricorda quello oggetto Table ha prodotto. Ma è possibile modificare la tabella associata prima di chiamare 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();

Altri suggerimenti

Che ne dite di qualcosa di simile a una classe base che si estende, che esegue l'avvio?

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

Anche se la maggior parte probabilmente già si avvicinò con una soluzione sarò ancora postare il modo in cui l'ho fatto: Ero alla ricerca di una soluzione per lo stesso problema e si avvicinò con l'idea di mettere la logica per quella in adattatore.

ho esteso lo Zend_Db_Adapter_Abstract e ha aggiunto l'attributo booleano $ scrive. Ho aggiunto metodi getter e setter pubblici per esso pure.

Il mio adattatore salva due differenti configurazioni del database-/ -connessioni: uno per il master (per la scrittura) e uno per lo slave (per la lettura). (In realtà non è una configurazione ma molti quindi ho una specie di pool di maestri e pomate che vengono selezionati in modo casuale in peso).

Ora faccio la seguente: Prima di eseguire una query $ scrittura deve essere impostato su true o false. Nel metodo connect () l'adattatore connette o utilizza la connessione giusta a seconda del valore di $ scrive.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top