2009-01-01 5 views
15

Ich erinnere mich zu hören, dass der Verbindungsprozess in MySQL wurde sehr schnell im Vergleich zu anderen RDBMSes entworfen, und dass die Verwendung von a library that provides connection pooling (SQLAlchemy) wird Ihnen nicht wirklich helfen, wenn Sie den Verbindungspool aktivieren.Mysql Verbindung Pooling Frage: ist es das wert?

Hat jemand Erfahrung damit?

Ich bin misstrauisch es zu aktivieren, weil die Möglichkeit, wenn etwas Code etwas Stateful zu einer DB-Verbindung macht und (vielleicht irrtümlicherweise) nicht nach sich selbst aufräumt, der Zustand, der normalerweise beim Schließen der aufgeräumt würde Die Verbindung wird stattdessen an den nachfolgenden Code weitergegeben, der eine wiederverwendbare Verbindung erhält.

Antwort

10

Wenn Sie den Verbindungspool von SQLA verwenden, müssen Sie sich keine Gedanken über den Restzustand einer Verbindung machen, es sei denn, Ihre Anwendung ändert verbindungsweite Optionen wie Transaktionsisolationsstufen (was normalerweise nicht der Fall ist). Der Verbindungspool von SQLA gibt eine connection.rollback() für die Verbindung aus, wenn sie erneut eingecheckt wurde, sodass alle Transaktionszustände oder Sperren gelöscht werden.

Es ist möglich, dass die Verbindungszeit von MySQL ziemlich schnell ist, besonders wenn Sie eine Verbindung über Unix-Sockets auf demselben Rechner herstellen. Wenn Sie einen Verbindungspool verwenden, möchten Sie auch sicherstellen, dass Verbindungen nach einiger Zeit wieder hergestellt werden, da die MySQL-Client-Bibliothek automatisch Verbindungen, die länger als 8 Stunden inaktiv sind, herunterfährt (in SQLAlchemy ist dies die pool_recycle-Option).

Sie können schnell eine Verbindung zwischen Verbindungspool und nicht mit einer SQLA-Anwendung durchführen, indem Sie die Poolimplementierung vom Standardwert QueuePool in NullPool ändern. Dies ist eine Poolimplementierung, die eigentlich nichts zusammenfasst - sie verbindet und trennt für real, wenn die Proxy-Verbindung erworben und später geschlossen wird.

6

Auch wenn der Verbindungsteil von MySQL selbst ziemlich glatt ist, ist vermutlich immer noch eine Netzwerkverbindung beteiligt (ob das Loopback oder physisch ist). Wenn Sie eine Los von Anfragen machen, könnte das erheblich teurer werden. Es hängt natürlich (wie so oft) genau davon ab, was Ihre Anwendung tut - wenn Sie pro Verbindung viel arbeiten, dann wird das dominieren und Sie werden nicht viel gewinnen.

Im Zweifelsfall, Benchmark - aber ich würde im Großen und Ganzen darauf vertrauen, dass eine Verbindung Pooling-Bibliothek (zumindest eine seriöse) ordnungsgemäß funktionieren und die Dinge angemessen zurücksetzen.

+0

Ich habe eine andere Frage/Kommentar zu Stackoverflow gefunden, die anzeigt, dass Apache Commons DB Connection Pooling schlecht ist. – the0ther

0

Der Verbindungspool beschleunigt Dinge in dieser Tatsache, dass Sie jedes Mal, wenn Sie eine Datenbankabfrage durchführen, kein java.sql.Connection-Objekt erstellen müssen. Ich benutze den Tomcat-Verbindungspool zu einer MySQL-Datenbank für Webanwendungen, die viele Abfragen ausführen, während bei hoher Benutzerlast eine merkliche Geschwindigkeitsverbesserung auftritt.

+0

Diese Frage ist für Python, nicht für Java. –

+0

@ZoranPavlovic eigentlich ist die Frage für MySQL. Wenn ein Verbindungspool eingerichtet ist, "hilft" das MySQL. Obwohl das OP einen Python-Verbindungspool-Client als Beispiel verwendet, sehe ich es nicht als den Hauptfokus der Frage. – Mark

2

Kurze Antwort: Sie müssen es benchmarken.

Lange Antwort: es kommt darauf an. MySQL ist schnell für den Verbindungsaufbau, daher ist es kein guter Grund, sich für das Verbindungs-Pooling zu entscheiden. Wo Sie gewinnen, gibt es, wenn die Abfragen laufen, sind wenige und schnell, denn dann werden Sie einen Gewinn mit Pooling sehen.

Die andere Sorge ist, wie die Anwendung den SQL-Thread behandelt. Wenn es keine SQL-Transaktionen durchführt und keine Annahmen über den Status des Threads trifft, ist das Pooling kein Problem. OTOH, Code, der auf das Schließen des Threads angewiesen ist, um temporäre Tabellen zu verwerfen oder Transaktionen rückgängig zu machen, wird viele Probleme mit dem Pooling haben.

0

Ich habe einen einfachen RESTful Service mit Django gemacht und getestet mit und ohne Verbindungspooling.In meinem Fall war der Unterschied ziemlich auffällig.

In einem LAN, ohne es war die Reaktionszeit zwischen 1 und 5 Sekunden. Mit ihm weniger als 20 ms. Ergebnisse können variieren, aber die Konfiguration, die ich für die Apache-Server MySQL & verwende, ist ziemlich Standard-Low-End.

Wenn Sie UI-Seiten über das Internet bereitstellen, ist die zusätzliche Zeit für den Benutzer möglicherweise nicht spürbar, aber in meinem Fall war es nicht akzeptabel, also entschied ich mich für den Pool. Hoffe das hilft dir.