Переключатель Master/Slave на уровне приложения Zend Framework

StackOverflow https://stackoverflow.com/questions/1826798

Вопрос

Я пишу приложение, которое требует, чтобы переключение Master/Slave происходило внутри уровня приложения.Как и сейчас, я создаю экземпляр объекта Zend_Db_Table при создании сопоставителя, а затем устанавливаю DefaultAdapter на подчиненное устройство.

Теперь внутри базового класса картографа у меня есть следующий метод:

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

Мне нужна проверка здравомыслия по этому поводу.Я не думаю, что накладные расходы слишком велики, я просто подозреваю, что должен быть лучший способ.

Это было полезно?

Решение

Объект типа Zend_Db_Table_Row_Abstract запоминает, какой объект Table его создал.Но вы можете изменить связанную таблицу перед вызовом 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();

Другие советы

Как насчет чего-то вроде расширяемого базового класса, который выполняет запуск?

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

Хотя вы, скорее всего, уже придумали решение, я все равно опубликую, как я это сделал:Я искал решение той же проблемы, и мне пришла в голову идея поместить эту логику в адаптер.

Я расширил Zend_Db_Adapter_Abstract и добавил логический атрибут $writes.Я также добавил для него публичные методы получения и установки.

Мой адаптер сохраняет две разные конфигурации/соединения базы данных:один для ведущего (для записи) и один для ведомого (для чтения).(На самом деле это не одна конфигурация, а несколько, поэтому у меня есть своего рода пул мастеров и мазей, которые выбираются случайным образом по весу.)

Теперь я делаю следующее:Прежде чем я выполню запрос, для $writes должно быть установлено значение true или false.В методе Connect() адаптер подключается или использует правильное соединение в зависимости от значения $writes.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top