服务器空闲几个小时后,sqlalchemy无法连接到数据库

时间:2011-07-06 05:56:46

标签: postgresql sqlalchemy firewall

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

系统可以正常运行几个小时,但是一旦它长时间处于空闲状态,服务器和数据库之间的通信就会失败。错误日志是:

WARNI [sqlalchemy.pool.QueuePool.0x...7310] [worker 26] Error closing cursor: cursor already closed

我设置了连接池,其中'pool_recylce'设置设置为30分钟,因此没有连接延迟超过30分钟。问题依然存在。

任何想法?

1 个答案:

答案 0 :(得分:5)

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

您需要:

  • 将防火墙配置为更长时间记住连接 - 尽管可能无法实现;
  • configure keepalive在服务器上,例如:
    tcp_keepalives_idle=600
    tcp_keepalives_interval=30
    tcp_keepalives_count=60
    
    这意味着如果连接空闲10分钟,尝试每隔30秒发送一次keepalive探测,直到响应,如果忽略60个探测则关闭连接(连接断开30分钟);
  • 使用`keepalives_idle`,`keepalives_interval`和`keepalives_count` connection parameters在客户端配置keepalive;我不知道SQLAlchemy是否可行;

禁用pool_recycle作为恕我直言,只有在您关闭连接时它才有效。