Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Knoten js (getConnection)

Zur Verdeutlichung:Node.js ist nicht eingängig. Ihr Anwendungscode wird in einem Thread ausgeführt, aber unter der Haube werden sie bei Bedarf verwendet - werfen Sie einen Blick auf hier (sowohl die Antwort als auch die Kommentare darunter):

Und:

Wie Sie sehen können, ist mysql -Modul, das Sie verwenden, erfordert, dass Sie einen Callback für query() übergeben Methode (und wahrscheinlich für viele mehr). Wenn Sie es also aufrufen, wird die Ausführung Ihres Codes fortgesetzt und der Rückruf wird aufgerufen, wenn die Ergebnisse aus der Datenbank eintreffen.

Zu Ihrer Frage:Sie erstellen nicht für jede Anfrage eine neue Verbindung. Sehen Sie sich die readme an Datei des mysql Modul, das Pooling-Verbindungen Abschnitt :

Wenn Sie dbPool.getConnection() aufrufen Die Verbindung wird nur erstellt, wenn es keine verfügbaren Verbindungen mehr im Pool gibt - andernfalls greift es einfach eine von oben. Aufruf von objConn.release() gibt die Verbindung zum Pool wieder frei - sie wird nicht getrennt. Dieser Aufruf ermöglicht die Wiederverwendung durch andere Teile Ihrer Anwendung.

Zusammenfassend:

  • Das Erstellen einer neuen Verbindung für jede Anfrage ist keine gute Idee da es mehr Ressourcen (CPU, RAM) sowohl auf den Computern Ihrer App als auch der Datenbank verbraucht.
  • Eine Verbindung für alle Anfragen zu verwenden ist ebenfalls falsch, denn wenn einer der Vorgänge lange dauert, bis Ihre Verbindung abgeschlossen ist, hängt Ihre Verbindung und alle anderen Anfragen müssen darauf warten.
  • Einen Verbindungspool verwenden ist eine großartige Idee, mit der Sie mehrere Operationen gleichzeitig auf Ihrer Datenbank ausführen können, auch wenn eine davon sehr lange dauert.

Aktualisierung: Um die Fragen von Kommentaren zu beantworten:

Wenn Sie für jede Anfrage eine Verbindung verwenden, wird mysql -Modul muss einen neuen Socket öffnen, sich mit der Datenbank verbinden und sich authentifizieren, bevor Sie Ihre Abfrage stellen - das kostet Zeit und verbraucht einige Ressourcen. Aus diesem Grund ist es ein schlechter Ansatz.

Andererseits, wenn nur eine Verbindung verwendet wird (kein Verbindungspool) blockiert das Ausführen einer Abfrage, deren Abschluss lange dauert, alle anderen Abfragen für diese Verbindung, bis sie abgeschlossen ist – was bedeutet, dass alle anderen Anforderungen warten müssen. Es ist auch ein schlechter Ansatz.

Das Erstellen eines neuen Verbindungspools für jede Anfrage ist ziemlich ähnlich wie die Verwendung einer neuen Verbindung, es sei denn, Sie rufen pool.getConnection() auf mehrmals - dann ist es noch schlimmer (nimm die Ressourcen, die durch das Erstellen einer neuen Verbindung verwendet werden, und multipliziere sie mit der Anzahl von pool.getConnection() Anrufe).

Um die eine Verbindung für jede Operation weiter zu verdeutlichen vs alle Vorgänge in einer Verbindung Frage:

Jede Operation in jeder Verbindung wird gestartet, nachdem die vorherige abgeschlossen ist (sie ist synchron, aber nicht auf der Clientseite), wenn Sie also eine Tabelle mit ein paar Milliarden Zeilen haben und SELECT * FROM yourtable ausgeben Es wird einige Zeit dauern, bis er abgeschlossen ist, und blockiert jeden Vorgang auf dieser Verbindung, bis er abgeschlossen ist.

Wenn Sie für jede Operation, die parallel ausgegeben werden muss (z. B. für jede Anfrage), eine Verbindung haben, verschwindet das Problem. Aber wie bereits erwähnt, erfordert das Öffnen einer neuen Verbindung Zeit und Ressourcen, weshalb der Verbindungspool verwendet wird Konzept wurde eingeführt.

Die Antwort lautet also:Einen Verbindungspool für alle Anfragen verwenden (wie in Ihrem Beispielcode) - die Anzahl der Verbindungen wird entsprechend dem Datenverkehr in Ihrer App skaliert.

Aktualisierung Nr. 2:

Aufgrund der Kommentare sehe ich, dass ich auch das Konzept hinter Verbindungspools erläutern sollte. Wie es funktioniert, starten Sie eine App mit einem leeren Verbindungspool und initialisiert, um maximal n zu erstellen Verbindungen (afaik es ist 10 für mysql Modul standardmäßig).

Immer wenn Sie dbPool.getConnection() aufrufen Es prüft, ob im Pool verfügbare Verbindungen vorhanden sind. Wenn es einen gibt, schnappt er sich einen (macht ihn nicht verfügbar), wenn nicht, erstellt er einen neuen. Wenn das Verbindungslimit erreicht ist und es keine verfügbaren Verbindungen gibt, wird eine Art Ausnahme ausgelöst.

Aufruf von connection.release() gibt die Verbindung zum Pool wieder frei, damit sie wieder verfügbar ist.

Die Verwendung eines Pools, um nur eine globale Verbindung für eine ganze App zu erhalten, ist völlig falsch und widerspricht dem Konzept selbst (Sie können dasselbe tun, indem Sie die Verbindung einfach manuell erstellen), also verwenden Sie einen Verbindungspool Ich meine verwenden Sie einen Verbindungspool so, wie er verwendet werden sollte - um Verbindungen daraus zu erhalten, wenn Sie sie benötigen .