PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann man TCP/IP-Verbindungen durch Keepalive PostgreSQL unterbrechen, ohne etwas im Register zu ändern?

PostgreSQL unter Windows unterstützt keine Keepalive-Einstellungen für eine Verbindung. Es verwendet setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE, ...) das ist IMHO Linux-spezifisch.

Sie können einen Patch für Postgres implementieren, sodass es SIO_KEEPALIVE_VALS . So etwas in src/backend/libpq/pqcomm.c in StreamConnection Funktion.

{
    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");
    }
}

Oder Sie können systemweite Einstellungen in der Windows-Registrierung HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters festlegen mit KeepAliveInterval und KeepAliveTime Einstellungen (Zähler ist immer 10 unter Windows Vista und höher).