0

クライアントサーバー構造とPostgreSQL8.4で動作するシステムがあります。私の問題は、クライアントがレコードを編集していてサーバーへの接続を失った場合でも、TCPIP接続が考慮されることです。したがって、レコードはデータベース内のクライアントに割り当てられたままになります。レコードを数分で無料で編集できるようにする必要があります。したがって、「postgresql.conf」でKEEPALIVE構成を設定します。

tcp_keepalives_idle = 60 # TCP_KEEPIDLE, in seconds; 
tcp_keepalives_interval = 60 # TCP_KEEPINTVL, in seconds; 
tcp_keepalives_count  = 5 # TCP_KEEPCNT

これらの設定を行ってサーバーを再起動した後も、システムは同じように機能し続けます。2時間後に接続TCPIPを切断し、PostgreSQLでレコードの割り当てを解除するだけです。PostgreSQLがこれらの接続を構成どおりに切断する必要があることを理解するための効率的で安全な方法が必要です!

4

1 に答える 1

2

Windows 上の PostgreSQL は、1 つの接続のキープアライブ設定をサポートしていません。setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE, ...)IMHO Linux固有のものを使用しています。

を使用するように Postgres のパッチを実装できますSIO_KEEPALIVE_VALS。このようなものsrc/backend/libpq/pqcomm.cStreamConnection機能しています。

{
    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およびKeepAliveTimeHKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters設定を使用して、Windows レジストリにシステム全体の設定を設定できます (Windows Vista 以降では、カウントは常に 10 です)。

于 2010-07-30T14:03:41.317 に答える