我有一个相当标准的设置,其中应用程序服务器由防火墙与数据库服务器分开。使用sqlalchemy和db的应用程序是postgres。
系统可以正常运行几个小时,但是一旦它长时间处于空闲状态,服务器和数据库之间的通信就会失败。错误日志是:
WARNI [sqlalchemy.pool.QueuePool.0x...7310] [worker 26] Error closing cursor: cursor already closed
我设置了连接池,其中'pool_recylce'设置设置为30分钟,因此没有连接延迟超过30分钟。问题依然存在。
任何想法?
答案 0 :(得分:5)
您可能在客户端和服务器之间有一个状态防火墙,忘记了空闲时间过长的连接。
您需要:
tcp_keepalives_idle=600 tcp_keepalives_interval=30 tcp_keepalives_count=60这意味着如果连接空闲10分钟,尝试每隔30秒发送一次keepalive探测,直到响应,如果忽略60个探测则关闭连接(连接断开30分钟);
禁用pool_recycle
作为恕我直言,只有在您关闭连接时它才有效。