情况:
- 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/