12

クライアントからのリクエストを処理するWebサーバーがあります。この Web サーバーの 1 つのコンポーネントは、データベースへの接続を保持します。

使用を開始する前に、接続が閉じられているか、何らかの理由で機能していないかを認識できる必要があります。現在、私は次のようなことをしています:

// Decide connection details on alias.
private String alias = null;
// I must have my own because I prepare statements.
private Connection connection = null;

public Connection getConnection() {
  try {
    if ( connection.isClosed() ) {
      // Start afresh.
      connection = null;
    }
    // ** More tests here to check connection is ok.
    if (connection == null) {
      // Make a new connection.
      connection = Connections.getConnection(alias);
    }
  } catch (SQLException ex) {
    // Cause a NPE further down the line.
    connection = null;
  }
  return connection;
}

悲しいことに、これにより、さまざまなエラーのいずれかが発生するような古い接続が返されることがあります。そのようなものは次のようになります。

java.sql.SQLException: Io 例外: ソフトウェアが原因で接続が中止されました: ソケット書き込みエラー

これは記録されたエラーの 1 つにすぎず、約 72 時間アイドル状態になった後に発生することに注意してください。

私が探しているのは、接続が稼働中であり、安定しているかどうかを一貫して伝える必要がある、接続の最小限のデータベース汎用テスターです。これは可能ですか?

それに対して非常に小さなクエリを実行してもかまいませんが、データベースにとらわれず、時間やリソースをほとんどまたはまったく必要としない必要があります。

ところで:私はJava 5で実行しているのでConnection.isValid、私にとっては解決策ではありません。


追加した

後でこの質問にアクセスする人のために-私は最終的に提供されたアドバイスを受けて、実際の接続プールに移動しました.驚くほど簡単に実行できるだけでなく、すべての問題が解消されました.

唯一の奇妙な部分は、接続プールを使用すると、接続が終了したときに接続する必要があるという認識でしたclose-プールはクローズをインターセプトし、舞台裏でプールに返します。

4

4 に答える 4

13

SELECT 1最良の方法は、またはSELECT 1 FROM DUALOracle のような単純な SQL ステートメントを実行することです。(ベンダー固有の構文については、データベースを参照してください。)

失敗した場合は、接続を更新します。これは、WebLogic などの Java EE アプリケーション サーバーが、そのように構成されている場合にテストするために行うことです。

于 2013-01-14T14:24:03.047 に答える
10

試す

java.sql.Connection.isValid(int timeout) 

接続が閉じられておらず、まだ有効な場合は true を返します。

于 2013-01-14T14:25:09.440 に答える
4

すべてのデータベースには、既存のテーブルに依存しないクエリがあります。Oracleの場合、試してください

select 1 from dual

他の多くのデータベース (MySQL、H2) については、試してください。

select 1

DB2 には独自の構文があります。

values 1
于 2013-01-14T14:25:40.863 に答える
1

私の場合、 java.sql.Connection.isValid(int timeout) を使用します:

メソッド getConnection (または、この例では getInstance no poll) があります。

try {
    if (connect == null) || ! connect.isValid() ) {
        connect.DriverManager.getConnection(...);
} catch (SQLException e) {
    logger.error(...);
    connect = null;
}
return connect;
于 2015-04-10T10:50:31.050 に答える