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上运行的是PostgreSQL 8.4,但似乎没有任何效果。我的测试是锁定表中的一行(使用SELECT FOR UPDATE)并断开工作站与网络的连接。但在Postgresql中,我仍然看到该工作站持有锁。
我期望在时间过去之后(在本例中为60秒),连接将被终止,锁将被释放。
要么是我做错了什么,要么是我完全误解了这是如何工作的。
有什么建议吗?
发布于 2010-02-03 02:35:19
我认为你需要配置你的操作系统。目前还不支持通过程序更改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个保持连接数据包)断开连接。
https://stackoverflow.com/questions/2166872
复制相似问题