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

Dim*_*ris 3 postgresql firewall sqlalchemy

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

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

WARNI [sqlalchemy.pool.QueuePool.0x...7310] [worker 26] Error closing cursor: cursor already closed
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Tom*_*zky 5

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

您需要:

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

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