Ein Verbindungspool eignet sich gut für solche Dinge. Ich habe nicht damit in der Produktion gearbeitet (hauptsächlich mit Django oder SQLAlchemy), aber psycopg2.pool
enthält einige verschiedene Implementierungen (SimpleConnectionPool
oder PersistentConnectionPool
), die wahrscheinlich Ihren Anforderungen entsprechen würden. Im Allgemeinen hilft ein Pool nicht nur beim Verwalten von Verbindungen als gemeinsam genutzte Ressource, sondern auch beim Testen und erneuten Initialisieren der Verbindung, wenn dies erforderlich ist.
from psycopg2 import pool
conn_pool = pool.PersistentConnectionPool(minconn, maxconn, **dbopts)
def work_method():
conn = conn_pool.getconn()
with conn.cursor() as stmt:
stmt.execute(sql)
conn_pool.putconn(conn)
Der putconn
ist extrem wichtig, damit eine Ausnahme den Pool nicht verlässt und denkt, dass die Verbindung noch verwendet wird. Wäre gut, es als Kontextmanager zu handhaben:
import contextlib
@contextlib.contextmanager
def get_db_connection():
conn = conn_pool.getconn()
yield conn
conn_pool.putconn(conn)
def work_method():
with get_db_connection() as conn:
with conn.cursor() as stmt:
stmt.execute(sql)
Hoffe das hilft.