gpt4 book ai didi

postgresql - TCP 保活不工作

转载 作者:行者123 更新时间:2023-11-29 12:21:03 24 4
gpt4 key购买 nike

情况:

  • Debian 服务器上的 Postgres 9.1
  • Scala(Java) 应用程序使用 LISTEN/NOTIFY 机制通过 JDBC 获得通知

由于通知之间可能会有很长的停顿(多天),我遇到了底层 TCP 连接在一段时间后静默终止并且我的应用程序停止接收通知的问题。

在谷歌搜索解决方案时,我发现有一个参数 tcpKeepAlive 可以在连接上设置。所以我将它设置为 true 并且很高兴。直到第二天我才发现我的连接再次中断。

正如我一直怀疑的那样,有一个并行运行的 wireshark 捕获,现在证明它非常有用。在感兴趣的连接上最后一次成功通信后大约整整两个小时,我的应用程序向数据库服务器发送了一个保活数据包。但是服务器以 RST 响应,因为它似乎已经关闭了连接。

服务器上的 net.ipv4.tcp_keepalive_time 设置为 7200,即 2 小时。

我是否需要以某种方式在服务器上启用 keepalive 或增加 keepalive_time

这是保持我的应用程序连接的方式吗?

TL;DR:我的数据库连接在长时间不活动后终止。设置 tcpKeepAlive 没有修复它,因为服务器响应 RST。怎么办?

最佳答案

正如 Craig 在评论中建议的那样,问题很可能与服务器和应用程序之间的某些网络硬件有关。解决方法是增加保持事件消息的频率。

在我的例子中,操作系统是 Windows,您必须创建一个注册表项,其中包含以毫秒为单位的空闲时间,之后应发送消息。相关信息here

我将它设置为 15 分钟,这似乎已经解决了问题。

更新:似乎只是解决了问题。大约两天的程序运行时间后,我的连接又消失了。我每次使用它时都切换到检查连接的有效性。这看起来不像是解决方案,但它仍然是一个解决方案。

关于postgresql - TCP 保活不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24133668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com