クライアントからのリクエストを処理する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
-プールはクローズをインターセプトし、舞台裏でプールに返します。