PQstatus を使用して PostgreSQL サーバーとの接続ステータスを確認しようとしていますが、サーバーへのケーブルが取り外されていても、常に CONNECTION_OK が返されます。
1 に答える
あなたの質問が「なぜそれが起こるのか」であると仮定すると、「それは予想される動作です」という答えは十分ではありません。
のドキュメントでは、サーバーに何かを送信して応答を待つなど、接続をテストPQstatus
することを約束していません。クライアント ライブラリで認識されている接続ステータスを返すだけです。このステータスは、(1) 接続に何かが発生した場合、(2) クライアント ライブラリがそれに気付く機会がある場合に変更される可能性があります。
SELECT 1
ケーブルが抜かれたことを知りたい場合は、定期的にサーバーに送信します。UPD: にもpg_ping
関数がlibpq
あり、無意味なクエリを必要とせずに同じことを行います。
基礎となる TCP レイヤーの場合でも、通常、ケーブルを抜いても接続は切断されません。システムはプラグが差し戻されるかどうかわからないため、賢明ではありません。オプションはありSO_KEEPALIVE
ますが、通常、接続が「切断」されたのが早すぎるとは見なされません (たとえば、Linux のデフォルトでは、非アクティブ状態が 3 時間続くとキープアライブ プローブが送信されます)。
また、接続が切断された場合でも、libpq
実際にソケットの読み取りまたは書き込みを試行して、エラーとして検出する必要があります。これは、上記のようにクエリを実行するなど、何らかの方法で実行するまで発生しません。