Pergunta

Eu estou escrevendo uma aplicação que requer o interruptor Master / Slave para acontecer dentro da camada de aplicação. Como é agora, eu instanciar um objeto Zend_Db_Table na criação do mapeador, e depois setDefaultAdapter ao escravo.

Agora dentro da classe base de mapeador, eu tenho o seguinte método:

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

Eu preciso de uma verificação de sanidade sobre este assunto. Eu não acho que a sobrecarga é demais, eu só suspeito deve haver uma maneira melhor.

Foi útil?

Solução

Um objeto do tipo Zend_Db_Table_Row_Abstract lembra o objeto Tabela produziu. Mas você pode mudar a tabela associada antes de chamar 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();

Outras dicas

Como sobre algo como uma classe base que você estender que executa a inicialização?

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

Embora você provavelmente já veio com uma solução ainda vou postar a maneira que eu fiz: Eu estava procurando por uma solução para o mesmo problema e veio com a idéia de colocar a lógica para que no adaptador.

Eu estendi a Zend_Db_Adapter_Abstract e acrescentou os boolean atributo $ gravações. Eu adicionei métodos get e set públicas para ele também.

O meu adaptador salva duas diferentes database-configurações / -Conexões: uma para o mestre (para escrita) e uma para o escravo (para leitura). (Na verdade, não é uma configuração mas muitos, por isso tenho uma espécie de piscina de mestres e pomadas que são selecionados aleatoriamente por peso.)

Agora eu faça o seguinte: Antes de executar uma consulta $ escreve deve ser definido como verdadeiro ou falso. No método connect () as Ligações adaptador ou usa a conexão correta dependendo do valor de $ gravações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top