Een verbindingspool werkt goed voor dit soort dingen. Ik heb er in de productie niet mee gewerkt (voornamelijk met Django of SQLAlchemy), maar psycopg2.pool
bevat een paar verschillende implementaties (SimpleConnectionPool
of PersistentConnectionPool
) die waarschijnlijk aan uw behoeften voldoet. Over het algemeen helpt een pool niet alleen bij het beheren van verbindingen als een gedeelde bron, maar ook bij het testen en opnieuw initialiseren van de verbinding wanneer dat nodig is.
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)
De putconn
is uiterst belangrijk, zodat een uitzondering de pool niet verlaat met het idee dat de verbinding nog steeds in gebruik is. Zou goed zijn om het als contextmanager aan te pakken:
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)
Ik hoop dat dat helpt.