Un pool di connessioni funziona bene per questo genere di cose. Non ci ho lavorato in produzione (usando principalmente Django o SQLAlchemy), ma psycopg2.pool
include alcune diverse implementazioni (SimpleConnectionPool
o PersistentConnectionPool
) che probabilmente si adatterebbe alle tue esigenze. In generale, un pool non solo aiuta a gestire le connessioni come risorsa condivisa, ma anche a testare e reinizializzare la connessione quando è necessario.
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)
Il putconn
è estremamente importante, in modo che un'eccezione non lasci il pool pensando che la connessione sia ancora in uso. Sarebbe bello gestirlo come un gestore di contesto:
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)
Spero di esserti stato d'aiuto.