一部のクライアントは、長時間、アイドル状態の接続を維持します。-これは、PostgreSQLの通知を待つとき、特に頻繁です。この予想される展開では、クライアントは、接続が、まだ、確立されている、そして、サーバーやネットワークの停止で壊れたことをどのように知ることができますか?この目的のために、Npgsqlは、キープアライブ機能を持っています。これにより、定期的な、SELECT NULLクエリが送信されます。この機能は、デフォルトで無効になっています。そして、Keepalive接続文字列パラメータで有効にする必要があります。それぞれのキープアライブ間の秒数を設定します。
キープアライブを有効にするとき、キープアライブが失敗すると、NpgsqlはNpgsqlConnection.StateChangeイベントを発行します。
あなたが必要な場合にのみ、この機能を有効にしてください。あなたが、長く続くアイドル状態の接続があることを知らない限り、そして、あなたのバックエンド(あるいは、ネットワーク装置)は、これらの接続のじゃまをします。これをオフのままにしておくことをお勧めします。
TCPのキープアライブ
TCP Keepalives
上記のキープアライブ・メカニズムは、長く続くアイドル接続に最適です。しかし、それは、問合せ処理の間、使用することができません。Amazon RedshiftやGreenplumのような、一部のPostgreSQLのようなデータ・ウェアハウス製品では、一つSQL文の実行に、長い時間がかかることは珍しくありません。そして、その間、SELECT NULLを送信することはできません。これらの場合、TCPのキープアライブをオンにするといいかもしれません。これは、上記のアプリケーション・レベルのキープアライブとは、かなり異なります。異なる種類のキープアライブを適切に理解するために、このブログの記事を参照してください。その記事が説明しているように、TCPのキープアライブは、ネットワーク・スタックのサポートに依存しており、常に機能するとは限りません。しかし、これは、クエリ処理中の唯一のオプションです。
Linux上では、接続文字列で、Tcp Keepalive=trueを指定するだけで、あなたは、キープアライブを有効にできます。既定のシステムでは、(interval、countなど)幅広い設定が使用され、現在、アプリケーション・レベルで、これらを指定することは不可能です。Windowsでは、また、あなたは、これらの設定を微調整するTcp Keepalive TimeとTcp Keepalive Intervalを指定することができます。