我有一个使用客户机-服务器结构和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了解它必须按照配置断开这些连接!
发布于 2010-07-30 22:03:41
Windows上的PostgreSQL不支持单个连接的保持连接设置。它使用的是特定于IMHO Linux的setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE, ...)。
您可以为Postgres实现一个补丁,这样它就可以使用SIO_KEEPALIVE_VALS。在StreamConnection函数的src/backend/libpq/pqcomm.c中类似这样。
{
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");
}
}或者,您可以使用KeepAliveInterval和KeepAliveTime设置在Windows注册表HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters中设置系统范围的设置(在Windows Vista和更高版本中,计数始终为10 )。
https://stackoverflow.com/questions/3366619
复制相似问题