Както казахте MySQlProxy може да бъде решение, но аз лично никога не съм го тествал в производството.
Използвам 2 Db връзки в моя код за разделяне на заявки за писане и четене. 80% от обичайните задачи се извършват с връзката за четене. Можете да използвате Zend_Application_Resource_Multidb за да се справя с това (За мен съм правил тази част много преди и просто съхранявам втора Db връзка в системния регистър).
- Първо ограничете потребителските си права само при операция за четене и създайте друг dbuser с разрешение за запис.
- след това проследявайте всяка заявка за запис във вашия код („актуализиране“, „вмъкване“, „изтриване“ е добро начало) и се опитайте да извършите всички тези обаждания със специален помощник.
- стартирайте приложението си и гледайте как се срива, след което отстранете проблемите :-)
По-лесно е, когато мислите за този проблем в началото. Например:
- Обикновено имам фабрика Zend_Db_Table, като вземам параметър 'read' или 'write' и ми дава Singleton на правилната Zend_Db_Table (двойно сингълтон, мога да имам екземпляр за четене и екземпляр за запис). Тогава трябва само да се уверя, че използвам правилната инициализирана Zend_Db_Table, когато използвам заявки/операции за достъп за запис. Забележете, че използването на паметта е много по-добро, когато използвате Zend_Db_Table като единични единици.
- Опитвам се да получа всички операции за запис в TransactionHandler. Там мога да проверя, че използвам само обекти, свързани с правилната връзка. След това транзакциите се управляват на контролери, аз никога не се опитвам да управлявам транзакции в слоевете на базата данни, цялото мислене за стартиране/коммит/връщане се извършва на контролерите (или друг концептуален слой, но не и слоя DAO).
Тази последна точка, транзакциите, е важна. Ако искате да управлявате транзакцията, важно е да направите заявките READ ВЪТРЕ в транзакцията , свръзката с активиран WRITE . Тъй като всички четения, извършени преди транзакцията, трябва да се считат за остарели и ако бекендът на вашата база данни прави имплицитни заключвания, ще трябва да направите заявката за четене, за да получите заключванията. Ако бекендът на вашата база данни не извършва неявно четене, тогава ще трябва да извършите и заключването на редове в транзакцията. И това означава, че не трябва да разчитате на ключовата дума SELECT, за да изпратите тази заявка към връзката само за четене.
Ако имате добро използване на db слой във вашето приложение, промяната не е много трудна за извършване. Ако сте направили хаотични неща с вашата база данни/DAO слой, тогава... може да е по-трудно.