0

2 時間以上かかる postgres クエリを実行しています。このクエリは、Java プログラムで hibernate を使用して実行されます。約 1.5 時間後、クエリは pg_admin のサーバー ステータスに表示されなくなります。

データベース上のアクティブなクエリのリストからクエリが消えたため、成功またはタイムアウト例外が発生することを期待しています。しかし、私は何も取得しません。(例外はありません)、スレッドは待機状態でスタックします。テーブルにいくつかの挿入を行うはずだったので、クエリが終了していないことはわかっていますが、テーブルに期待される行が見つかりません。

接続プールに pgbouncer を使用しており、query_timeout が無効になっています。休止状態のタイムアウトだった場合、例外が発生するはずでした。DB マシンとクライアント マシン (Java プログラムを実行しているマシン) の OS パラメータ

  • tcp_keepalive_time は 7200 (秒)
  • tcp_keepalive_intvl = 75
  • tcp_keepalive_probes = 9 (プローブの数) 両方のマシンで RHEL オペレーティング システムを実行します。私はその問題に指を置くことができません。
4

2 に答える 2

1

次のリソースをすでにご覧になっていると思います。

  1. PostgreSQL タイムアウトドキュメント
  2. PgBouncer タイムアウト (既に言及しています)。
  3. 休止状態のタイムアウト パラメータ (存在する場合)。

それが完了したら、(新規インストール時のパーミッションの問題のトリアージと同様に) さまざまなシナリオ (以下に示す) から次の SQL を試して、このタイムアウトの実際の原因を確認することをお勧めします。

SELECT pg_sleep(7200);
  1. (psql 経由で) サーバーにログインし、この SQL がタイムアウトするかどうかを確認します。
  2. PgBouncer に (再び psql 経由で) ログインし、PgBouncer がタイムアウトするかどうかを確認します。
  3. この SQL を Hibernate 経由で (PgBouncer 経由で) 実行し、タイムアウトがあるかどうかを確認します。

これにより、この原因を明確に切り分けることができます。

于 2016-02-03T13:13:34.550 に答える