Переключатель Master / Slave на уровне приложений Zend Framework - PullRequest
7 голосов
/ 01 декабря 2009

Я пишу приложение, которое требует переключения 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);
    }
}

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

Ответы [ 4 ]

3 голосов
/ 03 декабря 2009

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

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

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
0 голосов
/ 18 июля 2012

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

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

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

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

0 голосов
/ 23 июня 2011

Я нашел эту статью , которая, я думаю, ответит на ваш вопрос:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...