Un grupo de conexiones funciona bien para este tipo de cosas. No he trabajado con él en producción (usando principalmente Django o SQLAlchemy), pero psycopg2.pool
incluye algunas implementaciones diferentes (SimpleConnectionPool
o PersistentConnectionPool
) que probablemente se ajuste a sus necesidades. En términos generales, un grupo no solo ayuda a administrar las conexiones como un recurso compartido, sino que también prueba y reinicializa la conexión cuando es necesario.
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)
El putconn
es extremadamente importante, para que una excepción no abandone el grupo pensando que la conexión todavía está en uso. Sería bueno manejarlo como administrador de contexto:
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)
Espero que ayude.