sql >> Database teknologi >  >> RDS >> Mysql

Node js (getConnection)

For at præcisere - Node.js er ikke enkelt-gevind. Din applikationskode udføres i én tråd, men under hætten bruger den dem, når det er nødvendigt - tag et kig her (både svaret og kommentarerne under det):

Og:

Som du kan se mysql modul, du bruger, kræver, at du sender et tilbagekald for query() metode (og sikkert for mange flere). Så når du kalder det, fortsætter eksekveringen af ​​din kode, og tilbagekaldet kaldes, når resultaterne fra databasen ankommer.

Med hensyn til dit spørgsmål - du opretter ikke en ny forbindelse for hver anmodning. Tag et kig på readme fil af mysql modulet, Pooling-forbindelser afsnit :

Når du kalder dbPool.getConnection() forbindelsen oprettes kun, hvis der ikke er flere tilgængelige forbindelser i poolen - ellers griber den bare en fra toppen af ​​den. Kalder objConn.release() frigiver forbindelsen tilbage til poolen - den afbrydes ikke. Dette opkald gør det muligt at genbruge det af andre dele af din applikation.

For at opsummere:

  • At oprette en ny forbindelse for hver anmodning er ikke en god idé da det vil bruge flere ressourcer (CPU, RAM) på både din apps og databasens maskiner.
  • At bruge én forbindelse til alle anmodninger er også forkert, fordi hvis nogen af ​​handlingerne tager lang tid at fuldføre, vil din forbindelse blive hængende, så alle andre anmodninger venter på den.
  • Brug af en forbindelsespulje er en god idé, der giver dig mulighed for at udføre flere handlinger på din database på samme tid, selvom en af ​​dem tager lang tid at fuldføre.

Opdatering: For at besvare spørgsmålene fra kommentarer:

Når du bruger én forbindelse for hver anmodning, vises mysql modul skal åbne en ny socket, oprette forbindelse til databasen og godkende før du foretager din forespørgsel - det tager tid og tærer på nogle ressourcer. Derfor er det en dårlig tilgang.

På den anden side, når du kun bruger én forbindelse (ikke forbindelsespulje), vil kørsel af en forespørgsel, der tager lang tid at fuldføre, blokere alle andre forespørgsler på den forbindelse, indtil den er fuldført - hvilket betyder, at enhver anden anmodning skal vente. Det er også en dårlig tilgang.

At oprette en ny forbindelsespulje for hver anmodning er stort set som at bruge ny forbindelse, medmindre du kalder pool.getConnection() flere gange - så er det endnu værre (tag de ressourcer, der bruges ved at oprette en ny forbindelse, og gang det med antallet af pool.getConnection() opkald).

For yderligere at tydeliggøre en forbindelse for hver operation vs alle operationer i én forbindelse spørgsmål:

Hver operation i hver forbindelse startes, efter at den forrige er fuldført (den er synkron, men ikke på klientsiden), så hvis du har en tabel med et par milliarder rækker og udsteder SELECT * FROM yourtable det vil tage noget tid at fuldføre, hvilket blokerer hver handling på denne forbindelse, indtil den er færdig.

Hvis du har én forbindelse for hver operation, der skal udsendes parallelt (f.eks. for hver anmodning), forsvinder problemet. Men som tidligere nævnt kræver åbning af en ny forbindelse tid og ressourcer, og derfor er forbindelsespuljen koncept blev introduceret.

Så svaret er:brug én forbindelsespulje til alle anmodninger (som du gør i din eksempelkode) - antallet af forbindelser skaleres i overensstemmelse med trafikken på din app.

Opdatering #2:

På baggrund af kommentarerne ser jeg, at jeg også burde forklare konceptet bag forbindelsespuljer. Hvordan det virker er, at du starter en app med en forbindelsespulje tom og initialiseret til at oprette et maksimum på n forbindelser (afaik det er 10 for mysql modul som standard).

Hver gang du kalder dbPool.getConnection() den tjekker, om der er ledige forbindelser i poolen. Hvis der er, griber den en (gør den utilgængelig), hvis ikke den skaber en ny. Hvis forbindelsesgrænsen er nået, og der ikke er nogen tilgængelige forbindelser, hæves der en form for undtagelse.

Kalder connection.release() frigiver forbindelsen tilbage til poolen, så den er tilgængelig igen.

At bruge en pulje til kun at få én global forbindelse til en hel app er helt forkert og imod selve konceptet (du kan gøre det samme ved blot at oprette forbindelsen manuelt), så ved at bruge en forbindelsespulje Jeg mener brug en forbindelsespulje, som den skulle bruges - for at få forbindelser fra den, når du har brug for dem .



  1. Flere online operationer tilgængelige nu - eller snart

  2. Android Studio markerer/fremhæver ikke Kotlin Room DAO-forespørgsler, når strengen optager mere end 1 række

  3. Ufølsomme unikke modelfelter i Django?

  4. Fjern identitet fra en kolonne i en tabel