psql:致命错误:剩余的连接插槽保留用于非复制超级用户连接

问题描述

我想了解何时发生此错误以及如何解决。我检查了pg_stat_activitypg_locks,但无法弄清哪个进程正在耗尽连接

我们正在使用sqlalchemy如下连接数据库

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()

这是Heroku "psql: FATAL: remaining connection slots are reserved for non-replication superuser connections"

的扩展

解决方法

我正在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,因此我们可以包含要传递给数据库统计信息的所有自定义信息