postgresql - TCP 保活不工作

标签 postgresql jdbc keep-alive

情况:

  • 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/

相关文章:

mysql - Flyway MySQL语法错误

c++ - Linux TCP/IP 编程中的精确定时保持事件

connection - 如何知道大多数路由器所需的保活间隔?

sql - PostgreSQL 9.6 - 在冲突时插入并在返回时更新

java - Spring mvc-来自数据库的下拉框选项

node.js - 在 KNEX/BookshelfJS 中定义 'pool' 的语法

Java JDBC Sybase JConnect

java - 基于 JVM 的 longpoll/comet 客户端 : routers killing idle connections

postgresql - Zend pdo_pgsql 适配器是否允许您使用 PostgreSQL 的大部分优势?

PostgreSQL:是否可以将枚举转换为整数?