Wie man ein Verbindungspooling mit MySQL in Python durchführt und was man dagegen tun kann.
Wenn Sie einfach eine Verbindung mit dem offiziellen MySQL Python-Client mysql-connector-python herstellen möchten, können Sie zunächst Folgendes schreiben:
import mysql.connector
cnx = mysql.connector.connect(host="...", user="...", password="...", database="...")
Diese MySQL-Connector-Python bietet eine Klasse namens MySQLConnectionPool, die das Pooling von Verbindungen vereinfacht. [^ MySQLConnectionPool]
from mysql.connector.pooling import MySQLConnectionPool
cnxpool = MySQLConnectionPool(host="...", user="...", password="...", database="...", pool_size=10)
cnx = cnxpool.get_connection()
cnx.close() #Die Verbindung wird nicht getrennt und in den Verbindungspool freigegeben
Herzlichen Glückwunsch ... ** ist nicht der Fall. ** ** **
Versuchen Sie, den folgenden Code auszuführen.
from mysql.connector.pooling import MySQLConnectionPool
cnxpool = MySQLConnectionPool(host="...", user="...", password="...", database="...", pool_size=3)
cnxpool.get_connection()
cnxpool.get_connection()
cnxpool.get_connection()
cnxpool.get_connection() #=> PoolError: Failed getting connection; pool exhausted
MySQLConnectionPool wurde entwickelt, um ** eine Ausnahme auszulösen, wenn die Poolverbindungen erschöpft sind **.
Ich hasse diese einfache Spezifikation nicht, aber wenn ich sie tatsächlich in einer Webanwendung verwende, ist es oft schön, das Verhalten zu haben, "auf die Freigabe einer anderen Verbindung zu warten". Andernfalls tritt ein Fehler auf, auch wenn die Anzahl der verarbeiteten parallelen Anforderungen die Poolgröße nur geringfügig überschreitet.
Dieses Problem kann mit QueQPool von SQLAlchemy gelöst werden. [^ Warteschlangenpool]
from sqlalchemy.pool import QueuePool
cnxpool = QueuePool(lambda: mysql.connector.connect(host="...", user="...", password="...", database="..."), pool_size=10)
cnx = cnxpool.connect()
Es scheint, dass das erste Argument von QueuePool eine beliebige Funktion sein kann, die "Verbindungsobjekt entsprechend der DB-API" zurückgibt. Es ist vielseitig und erstaunlich.
Das Modul selbst mit dem Namen SQLAlchemy ist ORM, diesmal verwendet es jedoch nur den Mechanismus QueuePool, ohne den ORM-Teil zu verwenden.
Recommended Posts