Pro tento druh věcí dobře funguje fond připojení. Nepracoval jsem s tím ve výrobě (hlavně používám Django nebo SQLAlchemy), ale psycopg2.pool
obsahuje několik různých implementací (SimpleConnectionPool
nebo PersistentConnectionPool
), což by pravděpodobně vyhovovalo vašim potřebám. Obecně řečeno, fond nejen pomáhá se správou připojení jako sdíleného prostředku, ale také testuje a znovu inicializuje připojení, když je potřeba.
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
je extrémně důležité, aby výjimka neopustila fond, protože si myslel, že připojení je stále používáno. Bylo by dobré to zvládnout jako kontextový manažer:
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)
Doufám, že to pomůže.