BasicDataSource の使用方法に関連するいくつかのバグを修正しました。その一部は理解していますが、まだ回答されていない質問がいくつかあります:)
問題: データベースの障害の後、アプリケーションがデータベースに自動接続できませんでした。
アプリケーションは、Oracle db への JDBC 接続用の TCP 接続プールとしてorg.apache.commons.dbcp.BasicDataSource クラスを使用しています。
修正: いくつかの調査の結果、BasicDataSource で testOnBorrow と testOnreturn が設定されていないことがわかりました。接続をテストするための検証クエリを提供しました。これで問題が解決しました
プール内の接続の最大数が 1 に設定されました
私の理解: 接続プールは接続をアプリケーションに引き渡します。私が考えていたのは、データベースがクラッシュしたときにアプリケーションが魔法のように悪いコレクションをプールに返したことです。プールは接続が正しくないかどうかわからないため、次に必要になったときに同じ接続をアプリケーションに引き渡すため、アプリケーションはデータベースに自動再接続しません。
さて、修正後..接続プールに不良接続が返されるたびに、上記で行った修正のために破棄され、再度使用されることはありません。
これで、アプリケーションに与える前に BasicDataSource が接続をラップすることがわかりました。これにより、アプリケーションが con.close ..BasicDataSource と言うたびに、接続がもう使用されていないことがわかります..プールに接続を返すか、接続を処理します。破棄など
未回答の質問: しかし、私が理解していないのは、アプリケーションが壊れたときに魔法のように接続を接続プールに返す理由です[接続が正常に終了しない場合、con.closeメソッドは呼び出されないことに注意してください] 。BasicDataSource が接続が閉じられたこと、または ? があることを知る方法はありません。誰かがそのためのコードを教えてもらえますか?
私の全体的な理解は、修正が機能した理由につながりますか??