Postgresql 服务器闲置数小时后,sqlalchemy无法连接到db

Postgresql 服务器闲置数小时后,sqlalchemy无法连接到db,postgresql,sqlalchemy,firewall,Postgresql,Sqlalchemy,Firewall,我有一个相当标准的设置,其中应用服务器由防火墙与数据库服务器隔开。应用程序使用sqlalchemy,数据库是postgres 系统可以正常工作几个小时,但一旦长时间处于空闲状态,服务器和数据库之间的通信就会出现故障。错误日志为: WARNI [sqlalchemy.pool.QueuePool.0x...7310] [worker 26] Error closing cursor: cursor already closed 我将连接池的“pool_recylce”设置为30分钟,这样就不会有

我有一个相当标准的设置,其中应用服务器由防火墙与数据库服务器隔开。应用程序使用sqlalchemy,数据库是postgres

系统可以正常工作几个小时,但一旦长时间处于空闲状态,服务器和数据库之间的通信就会出现故障。错误日志为:

WARNI [sqlalchemy.pool.QueuePool.0x...7310] [worker 26] Error closing cursor: cursor already closed
我将连接池的“pool_recylce”设置为30分钟,这样就不会有连接延迟超过30分钟。问题依然存在


有什么想法吗?

在客户端和服务器之间可能有一个有状态的防火墙,它忘记了空闲时间过长的连接

您需要:

  • 将防火墙配置为更长时间地记住连接-但这可能不可能;
  • 在服务器上,例如: tcp_keepalives_idle=600 tcp_keepalives_interval=30 tcp_keepalives_count=60 tcp_keepalives_idle=600 tcp_keepalives_间隔=30 tcp_keepalives_count=60 这意味着,如果连接空闲10分钟,尝试每30秒发送一次keepalive探测,直到响应为止;如果忽略60个探测,则关闭连接(连接中断30分钟);
  • 使用“keepalives\u idle”、“keepalives\u interval”和“keepalives\u count”在客户端中配置keepalive;我不知道这在炼金术中是否可能;
禁用
pool\u recycle
,因为它只有在关闭连接时才起作用