Pula połączeń sprawdza się w takich sytuacjach. Nie pracowałem z nim w produkcji (używając głównie Django lub SQLAlchemy), ale psycopg2.pool
zawiera kilka różnych implementacji (SimpleConnectionPool
lub PersistentConnectionPool
), które prawdopodobnie pasowałyby do Twoich potrzeb. Ogólnie rzecz biorąc, pula nie tylko pomaga w zarządzaniu połączeniami jako zasobem udostępnionym, ale także w testowaniu i ponownej inicjalizacji połączenia, gdy jest to potrzebne.
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
jest niezwykle ważne, aby wyjątek nie opuścił puli myśląc, że połączenie jest nadal używane. Dobrze byłoby potraktować to jako menedżer kontekstu:
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)
Mam nadzieję, że to pomoże.