13

Postgresql 有 3 个用于管理断开连接的 keepalive 设置(在 postgresql.conf 中):

tcp_keepalives_count
tcp_keepalives_idle
tcp_keepalives_interval

默认情况下,这些为 0。

我想要的行为是让 Postgresql 在一段时间后断开客户端连接,如果客户端失去其网络连接或进入睡眠状态。

我目前正在使用这些值:

tcp_keepalives_count = 1
tcp_keepalives_idle = 60
tcp_keepalives_interval = 60

我在 Mac OS X 上运行 PostgreSQL 8.4,但它似乎没有任何效果。我的测试是我锁定表中的一行(使用 SELECT FOR UPDATE)并断开工作站与网络的连接。但是在 Postgresql 中,我仍然看到那个工作站持有锁。

我希望在时间过去后(在这种情况下为 60 秒),连接将被终止并且锁将被释放。

要么我做错了什么,要么我完全误解了这应该如何工作。

有什么建议吗?

4

1 回答 1

12

我认为您需要配置操作系统。通过程序更改保活参数尚未得到广泛支持。这应该可以帮助您:
使用 TCP keepalive 检测网络错误

此外,您的参数选择不当。如果tcp_keepalives_count=1有效,那么即使一个丢失的保活数据包也会断开您的连接。单个数据包经常丢失。我会/etc/sysctl.conf在 MacOSX/FreeBSD 上使用以下内容:
net.inet.tcp.keepidle = 60000
net.inet.tcp.keepintvl = 10000
然后操作系统最多会在 140 秒内断开连接(60 秒的空闲 + 10 个中的 8 个 keepalive 数据包秒间隔)在失去连接后。

于 2010-02-02T18:35:18.913 回答