PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment casser les connexions TCP/IP par keepalive postgreSQL sans rien changer au registre ?

PostgreSQL sur Windows ne prend pas en charge les paramètres keepalive pour une connexion. Il utilise setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE, ...) qui est spécifique à IMHO Linux.

Vous pouvez implémenter un correctif pour Postgres afin qu'il utilise SIO_KEEPALIVE_VALS . Quelque chose comme ça dans src/backend/libpq/pqcomm.c dans StreamConnection fonction.

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

Ou vous pouvez définir des paramètres à l'échelle du système dans le registre Windows HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters en utilisant KeepAliveInterval et KeepAliveTime paramètres (le nombre est toujours de 10 sous Windows Vista et versions ultérieures).