Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何通过keepalive postgreSQL断开TCP/IP连接而不更改寄存器中的任何内容?_.net_Postgresql_Tcp_Keep Alive - Fatal编程技术网

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

.net 如何通过keepalive postgreSQL断开TCP/IP连接而不更改寄存器中的任何内容?,.net,postgresql,tcp,keep-alive,.net,Postgresql,Tcp,Keep Alive,我有一个使用客户机-服务器结构和PostgreSQL 8.4的系统。 我的问题是,如果客户机正在编辑一条记录,并且失去了与服务器的连接,那么仍然会考虑TCPIP连接!因此,在我的数据库中为客户机分配的记录保留。 我需要这些记录在几分钟内免费编辑。因此,我在“postgresql.conf”中设置了KEEPALIVE配置: 在进行这些设置并重新启动服务器后,系统继续以相同的方式运行:两小时后中断连接TCPIP,然后在PostgreSQL中释放记录。我需要一种高效、安全的方式让PostgreSQL理

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


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

Windows上的PostgreSQL不支持一个连接的保留设置。它正在使用
setsockopt(s,IPPROTO\u TCP,TCP\u KEEPIDLE,…)
,这是特定于Linux的

您可以为Postgres实现一个补丁,以便它使用。在
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");
    }
}

或者您可以在Windows注册表
HKLM\system\CurrentControlSet\Services\Tcpip\Parameters
using and settings中设置系统范围的设置(在Windows Vista及更高版本中,计数始终为10)。

您的客户端和服务器操作系统是什么,版本是什么?可能您的系统不支持keepalive或更改keepalive参数。Postgres日志中是否有关于保留失败或不受支持的内容的消息?托梅茨基:我的操作系统是Windows Server 2008!托梅茨基:现在,我在Windows7上进行测试,日志上写着:“2010-07-29 08:17:34 BRT日志:巴西国家银行系统2010-07-29 08:17:34 BRT日志:inicializador do autovacuum foi iniciado 2010-07-29 08:17:35 BRT日志:setsockopt(TCP_KEEPIDLE)不支持2010-07-29 08:17:35 BRT日志:setsockopt(TCP_Keepindle)不受支持2010-07-29 08:17:35 BRT日志:setsockopt(TCP_keepnt)不受支持“托梅茨基,我对PostgreSQL非常失望!我需要断开空闲连接!有没有办法在不使用keepalive的情况下识别和断开丢失的连接?比如“通知”之类的东西?我的msnkanandasilvanos@hotmail.com. 谢谢,我已经添加了一个代码,当添加到Pg源代码时应该可以工作。如果无法使用系统范围的设置,您需要为自己修补和重建Pg。
{
    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");
    }
}