sql >> Database >  >> RDS >> Mysql

Knooppunt js (getConnection)

Ter verduidelijking:Node.js is niet enkeldraads. Uw applicatiecode wordt in één thread uitgevoerd, maar onder de motorkap gebruikt het ze wanneer nodig - kijk eens hier (zowel het antwoord als de opmerkingen eronder):

En:

Zoals je kunt zien, is de mysql module die u gebruikt, vereist dat u een callback doorgeeft voor de query() methode (en waarschijnlijk nog veel meer). Dus als je het aanroept, gaat de uitvoering van je code door en wordt de callback aangeroepen wanneer de resultaten van de database binnenkomen.

Wat betreft uw vraag - u maakt niet voor elk verzoek een nieuwe verbinding aan. Bekijk de leesmij bestand van de mysql module, de Pooling-verbindingen sectie :

Wanneer u dbPool.getConnection() . aanroept de verbinding wordt alleen gemaakt als er geen beschikbare verbindingen meer in de pool zijn - anders pakt het er gewoon een van de bovenkant ervan. Aanroepen van objConn.release() geeft de verbinding terug naar het zwembad vrij - het wordt niet verbroken. Met deze aanroep kan deze opnieuw worden gebruikt door andere delen van uw toepassing.

Samenvattend:

  • Voor elk verzoek een nieuwe verbinding maken is geen goed idee omdat het meer bronnen (CPU, RAM) zal gebruiken op zowel de machines van uw app als de database.
  • Het is ook verkeerd om één verbinding voor alle verzoeken te gebruiken, want als een van de bewerkingen lang duurt om te voltooien, zal uw verbinding vastlopen en alle andere verzoeken erop wachten.
  • Een verbindingspool gebruiken is een geweldig idee waarmee u meerdere bewerkingen op uw database tegelijkertijd kunt uitvoeren, zelfs als een ervan lang duurt om te voltooien.

Bijwerken: Om de vragen uit opmerkingen te beantwoorden:

Wanneer u één verbinding gebruikt voor elk verzoek, de mysql module moet een nieuwe socket openen, verbinding maken met de database en authenticeren voordat u uw query uitvoert - dit kost tijd en kost wat middelen. Daarom is het een slechte benadering.

Aan de andere kant, bij gebruik van slechts één verbinding (geen verbindingspool), het uitvoeren van een query die lang duurt om te voltooien, blokkeert alle andere query's op die verbinding totdat deze is voltooid - wat betekent dat elk ander verzoek moet wachten. Het is ook een slechte benadering.

Het maken van een nieuwe verbindingspool voor elk verzoek lijkt op het gebruik van een nieuwe verbinding, tenzij u pool.getConnection() aanroept meerdere keren - dan is het nog erger (neem de gebruikte bronnen door een nieuwe verbinding te maken en vermenigvuldig dit met het aantal pool.getConnection() oproepen).

Om de één verbinding voor elke bewerking verder te verduidelijken vs alle bewerkingen in één verbinding vraag:

Elke bewerking in elke verbinding wordt gestart nadat de vorige is voltooid (het is synchroon, maar niet aan de clientzijde), dus als je een tabel hebt met een paar miljard rijen en SELECT * FROM yourtable geeft het zal enige tijd duren om te voltooien, waarbij elke bewerking op deze verbinding wordt geblokkeerd totdat deze is voltooid.

Als u één verbinding heeft voor elke bewerking die parallel moet worden uitgegeven (bijvoorbeeld voor elke aanvraag), verdwijnt het probleem. Maar zoals eerder vermeld, vereist het openen van een nieuwe verbinding tijd en middelen, daarom is de verbindingspool concept werd geïntroduceerd.

Het antwoord is dus:gebruik één verbindingspool voor alle verzoeken (zoals u doet in uw voorbeeldcode) - het aantal verbindingen wordt geschaald overeenkomstig het verkeer op uw app.

Update #2:

Op basis van de opmerkingen zie ik dat ik ook het concept achter connectiepools moet uitleggen. Hoe het werkt, is dat u een app start met een lege en geïnitialiseerde verbindingspool om maximaal n te maken verbindingen (afaik het is 10 voor mysql module standaard).

Telkens wanneer u dbPool.getConnection() . aanroept het controleert of er beschikbare verbindingen in het zwembad zijn. Als die er zijn, pakt het er een (maakt het niet beschikbaar), zo niet, dan maakt het een nieuwe. Als de verbindingslimiet is bereikt en er zijn geen beschikbare verbindingen, wordt er een uitzondering gemaakt.

connection.release() . aanroepen verbreekt de verbinding terug naar de pool zodat deze weer beschikbaar is.

Een pool gebruiken om slechts één globale verbinding voor een hele app te krijgen is totaal verkeerd en tegen het concept zelf (je kunt hetzelfde doen door de verbinding gewoon handmatig te maken), dus door een verbindingspool te gebruiken Ik bedoel gebruik een verbindingspool zoals het bedoeld was - om er verbindingen uit te halen wanneer je ze nodig hebt .



  1. MySQL-lus door tabellen

  2. MIN-operator in MySQL?

  3. Wat is het nadeel van het gebruik van een MySQL-veld met de grootte van een lange tekst wanneer elk item in een veld van gemiddelde grootte past?

  4. Het probleem met verloren updates bij gelijktijdige transacties