5

私は postgres 9.1 org.apache.commons.dbcp.BasicDataSource(接続プール用) と Java 1.7 を使用しています。postgres サーバーを再起動すると、 のような例外が発生しますorg.postgresql.util.PSQLException: FATAL: terminating connection due to administrator command

接続が再起動されたデータベースに自動的に再接続されるようにするにはどうすればよいですか?

4

2 に答える 2

5

docsvalidationQueryによると、 DBCPには接続検証クエリオプションがあります。次のように設定すると、接続を返す前に DBCP がそれを実行してテストします。SELECT 1;

とはいえ、アプリは実際にこのケースを処理する必要があります。SQL クエリはあらゆる種類の理由で失敗する可能性があり、時間のバックオフと再試行制限を使用して、常に再試行ループでクエリを実行する必要があります。そのために)。

特に、検証は、次のようなイベントの順序付けが可能な競合状態の影響を受けます。

  1. 検証
  2. 接続をアプリに渡す
  3. サーバーのシャットダウン
  4. アプリが最初のステートメントを実行する

また

  1. 検証
  2. 接続をアプリに渡す
  3. アプリは最初のステートメントを実行し、トランザクションを開始します
  4. サーバーのシャットダウン
  5. アプリは 2 番目のステートメントを実行します

...そのため、アプリが適切な再試行ループと適切なトランザクション処理を行うことが引き続き重要です。

SQLException: から SQLState を取得できますSQLException.getSQLState。PostgreSQL のコードは、PostgreSQL のマニュアルに記載されています。

于 2013-06-04T23:45:45.557 に答える
3

この特定のケースでは、PostgreSQL 接続は、接続が作成された後にサーバーがシャットダウンされたことを示しています。DBCP 接続プールは、デフォルトの構成ではこの条件を処理しません。

validationQueryパラメーターをSELECT 1などに設定しても、少なくとも 1 つのtestOnXXXXパラメーターも設定しない限り、使用されません。

通常、testOnCreatetestOnBorrowの両方をtrueに設定します。

DBCP の他のデフォルト (org.apache.commons.pool2.impl.BaseObjectPoolConfig 内) も確認してください。私の意見では、それらは実稼働環境にはあまり適していません。

于 2015-04-09T09:03:55.673 に答える