Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Podziały odczytu/zapisu przy użyciu Zend_Db

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przechowywać pliki .pdf w MySQL jako bloki BLOB przy użyciu PHP?

  2. Kolumna Mysql Średnia w czasie?

  3. MySQL - Jak wstawić do tabeli, która ma relację wiele do wielu

  4. Jak podłączyć bazę danych MySQL do aplikacji C# WinForm?

  5. Warunkowe samodołączenie MySQL