问题描述
我想了解何时发生此错误以及如何解决。我检查了pg_stat_activity
和pg_locks
,但无法弄清哪个进程正在耗尽连接
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine_url = f'{dbms}://{username}:{password}@{hostname}:{port}/{database}'
engine = create_engine(engine_url,pool_size=20,max_overflow=10)
Session = sessionmaker(bind=engine)
db_session = Session()
的扩展
解决方法
我正在sqlalchemy引擎url的应用程序名称中添加客户端进程ID。它将存储在application_name
中的pg_stat_activity
下,这对于从打开此连接的位置进行调试将很有帮助。
import os
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
client_hostname = os.environ.get('HOSTNAME','UNKNOWN')
client_pid = os.getpid()
engine_url = f'{dbms}://{username}:{password}@{hostname}:{port}/{database}?application_name={client_hostname}_{client_pid}'
engine = create_engine(engine_url,pool_size=20,max_overflow=10)
Session = sessionmaker(bind=engine)
db_session = Session()
这显示了连接的来源,并且应用程序名称的限制为64 chars,因此我们可以包含要传递给数据库统计信息的所有自定义信息