Как разорвать соединения TCP / IP с помощью keepalive postgreSQL, ничего не меняя в реестре? - PullRequest
0 голосов
/ 30 июля 2010

У меня есть система, работающая со структурой клиент-сервер и PostgreSQL 8.4.Моя проблема в том, что если клиент редактирует запись и теряет соединение с сервером, соединение TCPIP все еще рассматривается!Итак, запись останется выделенной для клиента в моей базе данных.Мне нужно, чтобы записи были доступны для редактирования через несколько минут.Поэтому я установил конфигурацию KEEPALIVE в своем «postgresql.conf»:

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 Ответ

2 голосов
/ 30 июля 2010

PostgreSQL в Windows не поддерживает настройки keepalive для одного подключения.Он использует setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE, ...), что является IMHO для Linux.

Вы можете реализовать патч для Postgres, чтобы он использовал SIO_KEEPALIVE_VALS.Примерно так в src/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");
    }
}

Или вы можете установить системные настройки в реестре Windows HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters, используя KeepAliveInterval и KeepAliveTime настройки (в Windows Vista и более поздних версиях всегда 10).

...