首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不更改寄存器中任何内容的情况下通过keepalive postgreSQL断开连接TCP/IP?

问如何在不更改寄存器中任何内容的情况下通过keepalive postgreSQL断开连接TCP/IP?
EN

Stack Overflow用户
提问于 2010-07-30 04:22:49
回答 1查看 4.5K关注 0票数 0

我有一个使用客户机-服务器结构和PostgreSQL 8.4的系统。我的问题是,如果客户端正在编辑一条记录,并且断开了与服务器的连接,那么仍然可以考虑TCPIP连接!因此,在我的数据库中,记录仍然是为客户端分配的。我需要这些记录在几分钟内可以自由编辑。因此,我在“postgresql.conf”中设置了KEEPALIVE配置:

代码语言:javascript
复制
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了解它必须按照配置断开这些连接!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中类似这样。

代码语言:javascript
复制
{
    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 )。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3366619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档