Comment faire un pool de connexions avec MySQL en Python et que faire à ce sujet.
Tout d'abord, si vous souhaitez simplement créer une connexion avec le client MySQL Python officiel mysql-connector-python, vous pouvez écrire:
import mysql.connector
cnx = mysql.connector.connect(host="...", user="...", password="...", database="...")
Ce mysql-connector-python fournit une classe appelée MySQLConnectionPool, qui facilite le regroupement de connexions. [^ MySQLConnectionPool]
from mysql.connector.pooling import MySQLConnectionPool
cnxpool = MySQLConnectionPool(host="...", user="...", password="...", database="...", pool_size=10)
cnx = cnxpool.get_connection()
cnx.close() #La connexion n'est pas réellement déconnectée et est libérée dans le pool de connexions
Félicitations ... ** ce n'est pas le cas. ** **
Essayez d'exécuter le code suivant.
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 est conçu pour ** lever une exception lorsque les connexions du pool sont épuisées **.
Je ne déteste pas cette spécification simple, mais dans de nombreux cas, ce serait bien si elle se comportait comme "attendre qu'une autre connexion soit libérée" lors de son utilisation dans une application Web. Sinon, une erreur se produira même si le nombre de requêtes parallèles traitées dépasse même un peu la taille du pool.
Ce problème peut être résolu en utilisant QueuePool de SQLAlchemy. [^ Queue Pool]
from sqlalchemy.pool import QueuePool
cnxpool = QueuePool(lambda: mysql.connector.connect(host="...", user="...", password="...", database="..."), pool_size=10)
cnx = cnxpool.connect()
Il semble que le premier argument de QueuePool puisse être n'importe quelle fonction qui renvoie "objet de connexion correspondant à l'API DB". C'est polyvalent et incroyable.
Le module lui-même appelé SQLAlchemy est ORM, mais cette fois il n'utilise que le mécanisme appelé QueuePool sans utiliser du tout la partie ORM.
Recommended Posts