Một nhóm kết nối hoạt động tốt cho loại điều này. Tôi chưa làm việc với nó trong sản xuất (chủ yếu sử dụng Django hoặc SQLAlchemy), nhưng psycopg2.pool
bao gồm một số triển khai khác nhau (SimpleConnectionPool
hoặc PersistentConnectionPool
) mà có thể sẽ phù hợp với nhu cầu của bạn. Nói chung, một pool không chỉ giúp quản lý các kết nối như một tài nguyên được chia sẻ mà còn kiểm tra và khởi tạo lại kết nối khi cần.
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
là cực kỳ quan trọng, để một ngoại lệ không rời khỏi nhóm vì nghĩ rằng kết nối vẫn đang được sử dụng. Sẽ rất tốt nếu bạn xử lý nó như một trình quản lý ngữ cảnh:
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)
Hy vọng điều đó sẽ hữu ích.