Master / slave interruttore a livello di applicazione Zend Framework
-
11-09-2019 - |
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.
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.