sql >> Databasteknik >  >> RDS >> Mysql

Läs/skriv uppdelningar med Zend_Db

Som du sa kan MySQlProxy vara en lösning, men jag har personligen aldrig testat det i produktionen.

Jag använder 2 Db-anslutningar i min kod för att dela upp skriv- och läsförfrågningar. 80 % av de vanliga uppgifterna görs med läsanslutningen. Du kan använda Zend_Application_Resource_Multidb för att hantera det (för mig har jag gjort den här delen långt tidigare och jag lagrar helt enkelt en andra Db-anslutning i registret).

  • Begränsa först dina användarrättigheter endast vid läsning och skapa en annan dbuser med skrivbehörighet.
  • spåra sedan varje skrivförfrågan i din kod ("uppdatera", "infoga","radera" är en bra början) och försök att ringa alla dessa samtal med en dedikerad hjälpare.
  • kör din app och se hur den kraschar och åtgärda sedan problem :-)

Det är lättare när du tänker på det här problemet i början. Till exempel:

  • Jag har vanligtvis en Zend_Db_Table-fabrik som tar en "läs"- eller "skriv"-parameter och ger mig en Singleton av rätt Zend_Db_Table (en dubbel singelton, det kan jag ha en läsinstans och en skrivinstans). Sedan behöver jag bara se till att jag använder rätt initierad Zend_Db_Table när jag använder skrivåtkomstfrågor/operationer. Lägg märke till att minnesanvändningen är mycket bättre när du använder Zend_Db_Table som singlar.
  • Jag försöker få alla skrivoperationer i en TransactionHandler. Där kan jag kontrollera att jag bara använder objekt kopplade till rätt anslutning. Transaktioner hanteras sedan på controllers, jag försöker aldrig hantera transaktioner i databaslager, allt start/commit/rollback-tänkande görs på kontrollerna (eller annat konceptuellt lager, men inte DAO-lagret).

Denna sista punkt, transaktioner, är viktig. Om du vill hantera transaktionen är det viktigt att göra LÄS-förfrågningarna INNE i transaktionen , med den WRITE-aktiverade anslutningen . Eftersom alla läsningar som gjorts före transaktionen bör betraktas som föråldrade, och om din databasbackend gör implicita lås måste du göra läsbegäran för att få låsen. Om din databasbackend inte gör implicita läsningar måste du också utföra radlåsningen i transaktionen. Och det betyder att du inte bör förlita dig på nyckelordet SELECT för att skicka den begäran på skrivskyddad anslutning.

Om du har en bra användning av db-lager i din applikation är förändringen inte riktigt svår att göra. Om du gjorde kaotiska saker med din databas/DAO-lager då... kan det vara svårare.



  1. En omfattande guide om hur du använder MySQL

  2. Lagra IPv6 i databasen

  3. Observera:Konvertering av array till sträng i

  4. Klassarv med .NET EF4.1 + MySQL