TCP keepalive not working



情况:

    Postgres 9.1 for Debian ServerScala(Java)应用程序使用LISTEN/NOTIFY机制通过JDBC获得通知

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

当我搜索解决方案时,我发现有一个参数tcpKeepAlive,你可以在连接上设置。所以我把它设为true,很高兴。直到第二天我才发现我的网络又断了。

我一直怀疑有一个wireshark捕获并行运行,现在证明是非常有用的。在有关连接的最后一次成功通信大约两个小时之后,我的应用程序向数据库服务器发送了一个keepalive包。然而,服务器响应RST,因为它似乎已经关闭了连接。

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

我是否需要在服务器上启用keepalive或增加keepalive_time ?

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

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

正如Craig在评论中所说,这个问题很可能与服务器和应用程序之间的某些网络硬件有关。解决方法是增加keepalive消息的频率。

在我的情况下,操作系统是Windows,你必须创建一个注册表项,以毫秒为单位的空闲时间,之后应该发送消息。这里有相关信息

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

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

最新更新