En anslutningspool fungerar bra för sånt här. Jag har inte arbetat med det i produktionen (med huvudsakligen Django eller SQLAlchemy), utan psycopg2.pool
innehåller några olika implementeringar (SimpleConnectionPool
eller PersistentConnectionPool
) som förmodligen skulle passa ditt behov. Generellt sett hjälper en pool inte bara med att hantera anslutningar som en delad resurs, utan också att testa och återinitiera anslutningen när det behövs.
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)
putconn
är extremt viktigt, så att ett undantag inte lämnar poolen och tror att anslutningen fortfarande används. Skulle vara bra att hantera det som sammanhangshanterare:
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)
Hoppas det hjälper.