0

我有一个使用客户端-服务器结构和 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 了解它必须按照配置断开这些连接!

4

1 回答 1

2

Windows 上的 PostgreSQL 不支持一个连接的 keepalive 设置。它使用setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE, ...)的是恕我直言 Linux 特有的。

您可以为 Postgres 实现一个补丁,以便它使用SIO_KEEPALIVE_VALS. 像这样src/backend/libpq/pqcomm.cStreamConnection功能。

{
    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 注册表中设置系统范围的设置(在 Windows Vista 和更高版本上计数始终为 10)。

于 2010-07-30T14:03:41.317 回答