sql >> Databáze >  >> RDS >> Mysql

Čtení/zápis rozdělení pomocí Zend_Db

Jak jste řekl, MySQlProxy může být řešením, ale osobně jsem to nikdy netestoval ve výrobě.

Používám 2 Db připojení v mém kódu k rozdělení požadavků na zápis a čtení. 80 % obvyklých úkolů se provádí připojením pro čtení. Můžete použít Zend_Application_Resource_Multidb abych to zvládl (Pro mě jsem tuto část udělal už dávno předtím a jednoduše uložím druhé připojení Db do registru).

  • Nejprve omezte svá uživatelská práva pouze na operaci čtení a vytvořte další dbuser s oprávněním k zápisu.
  • pak sledujte každý požadavek na zápis ve svém kódu („aktualizace“, „vložení“, „smazání“ je dobrý začátek) a pokuste se provést všechna tato volání pomocí specializovaného pomocníka.
  • spusťte aplikaci a sledujte, jak se zhroutí, a poté opravte problémy :-)

Je to snazší, když na tento problém myslíte na začátku. Například:

  • Obvykle mám továrnu Zend_Db_Table, která přebírá parametr 'čtení' nebo 'zápis' a dává mi Singleton správné Zend_Db_Table (duální singleton, mohu mít instanci pro čtení a instanci pro zápis). Pak se musím pouze ujistit, že používám správně inicializovanou Zend_Db_Table, když používám dotazy/operace pro přístup k zápisu. Všimněte si, že využití paměti je mnohem lepší, když používáte Zend_Db_Table jako singletony.
  • Snažím se získat všechny operace zápisu v TransactionHandler. Tam mohu zkontrolovat, zda používám pouze objekty spojené se správným připojením. Transakce jsou pak spravovány na řadičích, nikdy se nesnažím řídit transakce v databázových vrstvách, veškerá úvaha o spuštění/potvrzení/vrácení zpět probíhá na řadičích (nebo jiné koncepční vrstvě, ale ne vrstvě DAO).

Tento poslední bod, transakce, je důležitý. Pokud chcete spravovat transakci, je důležité provést požadavky READ UVNITŘ transakce , s připojením s povoleným WRITE . Protože všechna čtení provedená před transakcí by měla být považována za zastaralá, a pokud vaše databázový backend provádí implicitní zámky, budete muset zadat požadavek na čtení, abyste zámky získali. Pokud váš databázový backend neprovádí implicitní čtení, budete muset v transakci také provést uzamčení řádků. A to znamená, že byste se neměli spoléhat na klíčové slovo SELECT k odeslání tohoto požadavku na připojení pouze pro čtení.

Pokud máte ve své aplikaci pěkné použití vrstvy db, není opravdu těžké provést změnu. Pokud jste vytvořili chaotické věci s vaší databázovou/DAO vrstvou, pak... to může být těžší.



  1. Jak vytvořit zálohu jedné tabulky v databázi postgres?

  2. Chyba příliš mnoha otevřených souborů na Ubuntu 8.04

  3. Volání uložené procedury v codeigniter

  4. Jaká je výhoda použití try {} catch {} oproti if {} else {}