如何通过keepalive postgreSQL中断连接TCP / IP而不更改寄存器中的任何内容?

时间:2010-07-29 20:22:49

标签: .net postgresql tcp keep-alive

我有一个使用客户端 - 服务器结构和PostgreSQL 8.4的系统。 我的问题是,如果客户端正在编辑记录并丢失与服务器的连接,则仍会考虑TCPIP连接!因此,记录会在我的数据库中为客户端分配。 我需要记录在几分钟内免费编辑。因此我在“postgresql.conf”中设置了KEEPALIVE配置:

tcp_keepalives_idle = 60 # TCP_KEEPIDLE, in seconds; 
tcp_keepalives_interval = 60 # TCP_KEEPINTVL, in seconds; 
tcp_keepalives_count  = 5 # TCP_KEEPCNT

进行这些设置并重新启动服务器后,系统将继续以相同的方式运行:两小时后断开连接TCPIP,然后在PostgreSQL中取消分配记录。我需要一种有效且安全的方法让PostgreSQL理解它必须按照配置打破这些连接!

1 个答案:

答案 0 :(得分:2)

Windows上的PostgreSQL不支持一个连接的keepalive设置。它使用的是setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE, ...),这是特定于IMHO Linux的。

您可以为Postgres实施一个补丁,以便它使用SIO_KEEPALIVE_VALSsrc/backend/libpq/pqcomm.c函数StreamConnection中的{ DWORD bytesReturned = 0; tcp_keepalive vals; vals.keepalivetime = 60*1000; /* milliseconds */ vals.keepaliveinterval = 60*1000; /* milliseconds */ vals.onoff = 1; err = WSAIoctl( port->sock, SIO_KEEPALIVE_VALS, (char *)&vals, sizeof(vals), NULL, 0, &bytesReturned, NULL, NULL); if (err == -1) { elog(LOG, "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %m"); } }

HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

或者您可以使用KeepAliveIntervalKeepAliveTime设置在Windows注册表{{1}}中设置系统范围的设置(Windows Vista及更高版本的计数始终为10)。