Jak powiedziałeś, MySQlProxy może być rozwiązaniem, ale osobiście nigdy nie testowałem go w środowisku produkcyjnym.
Używam połączeń 2 Db w moim kodzie do dzielenia żądań zapisu i odczytu. 80% zwykłych zadań jest wykonywanych za pomocą połączenia do odczytu. Możesz użyć Zend_Application_Resource_Multidb aby sobie z tym poradzić (dla mnie zrobiłem tę część na długo wcześniej i po prostu przechowuję drugie połączenie Db w rejestrze).
- Najpierw ogranicz swoje prawa użytkownika tylko do operacji odczytu i utwórz kolejnego dbusera z autoryzacją zapisu.
- następnie śledź każde żądanie zapisu w swoim kodzie („aktualizacja”, „wstaw”, „usuń” to dobry początek) i spróbuj wykonać wszystkie te wywołania z dedykowanym pomocnikiem.
- uruchom aplikację i zobacz, jak się zawiesza, a następnie napraw problemy :-)
Łatwiej jest, gdy myślisz o tym problemie na początku. Na przykład:
- Zazwyczaj mam fabrykę Zend_Db_Table, przyjmującą parametr 'odczyt' lub 'zapis' i dając mi Singletona właściwego Zend_Db_Table (podwójnego singletona, mogę mieć instancję odczytu i instancję zapisu). Następnie muszę tylko upewnić się, że używam prawidłowo zainicjowanej tabeli Zend_Db_Table, gdy używam zapytań/operacji z dostępem do zapisu. Zauważ, że użycie pamięci jest znacznie lepsze, gdy używasz Zend_Db_Table jako singletonów.
- Staram się uzyskać wszystkie operacje zapisu w TransactionHandler. Tam mogę to sprawdzić, używam tylko obiektów połączonych odpowiednim połączeniem. Transakcje są następnie zarządzane na kontrolerach, nigdy nie próbuję zarządzać transakcjami w warstwach bazy danych, całe myślenie o uruchomieniu/zatwierdzeniu/wycofaniu odbywa się na kontrolerach (lub innej warstwie koncepcyjnej, ale nie w warstwie DAO).
Ten ostatni punkt, transakcje, jest ważny. Jeśli chcesz zarządzać transakcją, ważne jest, aby żądać PRZECZYTAJ WEWNĄTRZ transakcji , z połączeniem z włączonym WRITE . Ponieważ wszystkie odczyty wykonane przed transakcją powinny być uważane za przestarzałe, a jeśli twoja baza danych wykonuje niejawne blokady, będziesz musiał wykonać żądanie odczytu, aby uzyskać blokady. Jeśli zaplecze Twojej bazy danych nie wykonuje niejawnych odczytów, będziesz musiał również wykonać blokady wierszy w transakcji. A to oznacza, że nie powinieneś polegać na słowie kluczowym SELECT, aby przekazać to żądanie w połączeniu tylko do odczytu.
Jeśli w swojej aplikacji używasz warstwy db, zmiana nie jest trudna. Jeśli zrobiłeś chaotyczne rzeczy ze swoją bazą danych/warstwą DAO, to... może być trudniej.