我有一个相当标准的设置,其中应用程序服务器与数据库服务器通过防火墙隔开。应用程序使用 sqlalchemy,数据库是 postgres。
系统运行几个小时都没问题,但一旦长时间处于空闲状态,服务器和数据库之间的通信就会失败。错误日志为:
WARNI [sqlalchemy.pool.QueuePool.0x...7310] [worker 26] Error closing cursor: cursor already closed
我设置了连接池,将“pool_recylce”设置为 30 分钟,这样就不会有连接停留超过 30 分钟。问题仍然存在。
有任何想法吗?
更新:我在 stackoverflow 上发布了同样的问题,并得到了一个可行的答案。请查看https://stackoverflow.com/questions/6592137/sqlalchemy-fails-to-connect-to-db-after-server-is-idle-for-a-few-hours
答案1
我建议确保半小时空闲后没有活动连接,例如netstat -tpn
。至少这会将问题缩小到 (a) 连接仍然打开,因此pool_recycle 无法按预期工作,或 (b) 没有打开的连接,问题出在其他地方。