Пулът на връзки работи добре за този вид неща. Не съм работил с него в производството (използвайки главно Django или SQLAlchemy), но psycopg2.pool
включва няколко различни реализации (SimpleConnectionPool
или PersistentConnectionPool
), което вероятно ще отговаря на вашите нужди. Най-общо казано, пулът не само помага при управлението на връзките като споделен ресурс, но и при тестването и повторното инициализиране на връзката, когато е необходимо.
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
е изключително важно, така че изключение да не напусне пула, мислейки, че връзката все още се използва. Би било добре да го управлявате като контекстен мениджър:
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)
Надявам се, че това помага.