Intereting Posts
Использование двух внешних ключей в качестве первичного ключа – MySQL Могу ли я добавить промежуточное ПО к файлу Guzzle 6 HandlerStack по умолчанию, а не создавать новый стек? Laravel 4.2: включить PHP-файл (библиотеку) в контроллер Использование двойных кавычек в значении 'input type = "text"' не работает, строка останавливается при двойной кавычке! PHP MYSQL ищет почтовый индекс, используя LIKE Разница между DirectoryIterator и FileSystemIterator Подписки WooCommerce – проверьте, есть ли у продукта активный абонент как печатать данные из mysql в pdf-файл, используя php Предотвратите порядок ввода html-тегов Как заменить белый прямоугольник в изображении с помощью ImageMagick? PHP и MySQL лучший способ подсчета просмотров страниц для динамических страниц PHPExcel не будет экспортировать в CSV Выпадающий список, где параметры заполняют второй список js / php? Подключение к CMU Sphinx с использованием PHP Возврат только последнего результата из LEFT JOIN

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

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

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

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 запоминает, какой объект таблицы его создал. Но вы можете изменить соответствующую таблицу перед вызовом 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 и добавил логический атрибут $ write. Я также добавил для него общедоступные методы getter и setter.

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

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