Pregunta

Estoy escribiendo una aplicación que requiere el interruptor maestro / esclavo que suceda dentro de la capa de aplicación. Ya que es en este momento, una instancia de un objeto Zend_Db_Table en la creación del mapeador, y luego setDefaultAdapter al esclavo.

Ahora dentro de la Classe asignador de base, tengo el siguiente 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);
    }
}

Necesito una comprobación de validez en esto. No creo que la sobrecarga es demasiado, yo sólo sospecho que debe haber una mejor manera.

¿Fue útil?

Solución

Un objeto de tipo Zend_Db_Table_Row_Abstract recuerda lo objeto de tabla produjo. Pero se puede cambiar la tabla asociada antes de llamar 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();

Otros consejos

¿Qué tal algo así como una clase base que se amplía que lleva a cabo la puesta en marcha?

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

A pesar de que lo más probable es que ya se le ocurrió una solución todavía voy a publicar la forma en que lo hice: Yo estaba buscando una solución para el mismo problema y se acercó con la idea de poner la lógica de que en el adaptador.

extendí la Zend_Db_Adapter_Abstract y añadido el atributo booleano $ escribe. He añadido los métodos getter y setter públicos para él también.

Mi adaptador ahorra dos bases de datos-configuraciones / -Conexiones diferentes: una para el maestro (por escrito) y uno para el esclavo (para lectura). (En realidad no es una configuración pero muchos así que tengo una especie de grupo de maestros y ungüentos que son seleccionados al azar en peso).

Ahora hago el siguiente: Antes de ejecutar una consulta escrituras $ se deben establecer en verdadero o falso. En el método connect () del adaptador se conecta o se utiliza la conexión correcta en función del valor de $ escribe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top