Пул соединений хорошо работает для такого рода вещей.Я не работал с ним в производстве (используя в основном 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)
Надеюсь, это поможет.