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秒),连接将被终止,锁定将被释放。
要么我做错了,要么我完全误解了这应该是怎么回事。
有什么建议吗?
答案 0 :(得分:10)
我认为您需要配置操作系统。尚未广泛支持通过程序更改keepalive参数。这应该对你有所帮助:
Using TCP keepalive to Detect Network Errors
您的参数选择也很糟糕。如果tcp_keepalives_count=1
工作,那么即使一个丢失的keepalive数据包也会丢失你的连接。并且单个数据包经常丢失。我在MacOSX / FreeBSD的/etc/sysctl.conf
中使用以下内容:
net.inet.tcp.keepidle = 60000
net.inet.tcp.keepintvl = 10000
在失去连接后,操作系统最多会丢弃连接140秒(空闲时间为60秒,间隔为10秒,8个保持连接数据包)。