sql >> Databasteknik >  >> RDS >> Mysql

Node js (getConnection)

För att förtydliga - Node.js är inte enkelgängad. Din applikationskod körs i en tråd, men under huven använder den dem när det behövs - ta en titt här (både svaret och kommentarerna under det):

Och:

Som du kan se mysql modul du använder kräver att du skickar en återuppringning för query() metod (och förmodligen för många fler). Så när du anropar den fortsätter exekveringen av din kod och återuppringningen anropas när resultaten från databasen anländer.

När det gäller din fråga - du skapar inte en ny anslutning för varje förfrågan. Ta en titt på readme filen för mysql modulen, Pooling-anslutningar avsnitt :

När du anropar dbPool.getConnection() anslutningen skapas bara om det inte finns fler tillgängliga anslutningar i poolen - annars tar den bara en från toppen av den. Anropar objConn.release() släpper anslutningen tillbaka till poolen - den kopplas inte bort. Detta anrop gör att det kan återanvändas av andra delar av din applikation.

För att sammanfatta:

  • Att skapa en ny anslutning för varje begäran är ingen bra idé eftersom det kommer att använda mer resurser (CPU, RAM) på både appens och databasens maskiner.
  • Att använda en anslutning för alla förfrågningar är också fel eftersom om någon av operationerna tar lång tid att slutföra kommer din anslutning att hänga sig så att alla andra förfrågningar väntar på den.
  • Använda en anslutningspool är en bra idé som låter dig utföra flera operationer på din databas samtidigt, även om en av dem tar lång tid att slutföra.

Uppdatering: För att svara på frågorna från kommentarer:

När du använder en anslutning för varje begäran visas mysql modulen måste öppna en ny socket, ansluta till databasen och autentisera innan du gör din förfrågan - detta tar tid och tär på en del resurser. Därför är det ett dåligt tillvägagångssätt.

Å andra sidan, när du bara använder en anslutning (inte anslutningspool), att köra en fråga som tar lång tid att slutföra kommer att blockera alla andra frågor på den anslutningen tills den slutförs - vilket innebär att alla andra förfrågningar måste vänta. Det är också ett dåligt tillvägagångssätt.

Att skapa en ny anslutningspool för varje begäran är ungefär som att använda ny anslutning, såvida du inte anropar pool.getConnection() flera gånger - då är det ännu värre (ta resurserna som används genom att skapa en ny anslutning och multiplicera den med antalet pool.getConnection() samtal).

För att ytterligare förtydliga en anslutning för varje operation kontra alla operationer i en anslutning fråga:

Varje operation i varje anslutning startas efter att den föregående är klar (den är synkron, men inte på klientsidan), så om du har en tabell med några miljarder rader och utfärdar SELECT * FROM yourtable det kommer att ta lite tid att slutföra, vilket blockerar varje operation på den här anslutningen tills den är klar.

Om du har en anslutning för varje operation som måste utfärdas parallellt (t.ex. för varje begäran) försvinner problemet. Men som tidigare nämnts att öppna en ny anslutning kräver tid och resurser, vilket är anledningen till att anslutningspoolen konceptet introducerades.

Så svaret är:använd en anslutningspool för alla förfrågningar (som du gör i din exempelkod) - antalet anslutningar skalas i enlighet med trafiken på din app.

Uppdatering #2:

Baserat på kommentarerna ser jag att jag också borde förklara konceptet bakom anslutningspooler. Hur det fungerar är att du startar en app med en anslutningspool tom och initierad för att skapa maximalt n anslutningar (det är 10 för mysql modul som standard).

När du anropar dbPool.getConnection() den kontrollerar om det finns några tillgängliga anslutningar i poolen. Om det finns tar den en (gör den otillgänglig), om inte skapar den en ny. Om anslutningsgränsen nås och det inte finns några tillgängliga anslutningar, höjs något slags undantag.

Anropar connection.release() släpper anslutningen tillbaka till poolen så att den är tillgänglig igen.

Att använda en pool för att bara få en global anslutning för en hel app är helt fel och mot själva konceptet (du kan göra samma sak genom att bara skapa anslutningen manuellt), så genom att använda en anslutningspool Jag menar använd en anslutningspool som den var tänkt att användas - för att få anslutningar från den när du behöver dem .



  1. hur man bygger en php mysql-applikation som fungerar offline

  2. Flera datacenterinställningar med Galera Cluster för MySQL eller MariaDB

  3. MySQL månadsförsäljning för de senaste 12 månaderna inklusive månader utan rea

  4. Django Multiple Databases Fallback till Master om Slave är nere