エグゼキュータを使用して接続プールを作成しています。私の問題は、データベースがダウンすると、プール内のすべての接続が無効な接続になることです。
1つの方法は、接続プールを定期的に更新するか、接続の有効性を確認することです。このタイプの問題を処理するための最良の方法は何ですか?
エグゼキュータを使用して接続プールを作成しています。私の問題は、データベースがダウンすると、プール内のすべての接続が無効な接続になることです。
1つの方法は、接続プールを定期的に更新するか、接続の有効性を確認することです。このタイプの問題を処理するための最良の方法は何ですか?
まず第一に、もしあなたが絶対に、間違いなく、どうしようもないなら、あなた自身を書かなければなりません、これは完全に素晴らしいホイールを再発明する本当の典型的なケースです。interwebzには、すばらしい接続プールの実装がたくさんあります。
私は(他の多くの中で)Apache DBCPを使用しています:http://commons.apache.org/dbcp/
ある種の超特別なデータベースがある場合は、少なくともCommons Poolのような既存のプーリングソリューションに依存することができます:http://commons.apache.org/pool/
あなたが知っている、apacheのものを使用するとあなたはクールな子供たちと一緒に座ることができます;)
それでは、もしあなたが本当にあなた自身を書く必要があるなら、私はこれを提案するでしょう:
接続が要求されるたびに、接続の有効性を確認してください。これを回避する方法はありません。有効でなくなった場合は、プール内のすべての接続をすぐに削除するか(すべてが無効であると想定)、次の接続を取得して、チェックした接続を削除します。有効なものが見つかるまで、またはプールを増やす必要があるまで繰り返します。プールを拡大するには、有効性を確認し、新しい接続を確立できない場合は中止する必要があります(明らかに)。そうでなければ、あなたはあなたの手にいくつかの素晴らしい無限ループを持っているでしょう。
プールをチェックしてクリーンアップしたり、必要に応じてプールを拡張したりするセカンダリスレッドも問題ないようです。無効な接続を見逃す可能性があり、使用できないプール要素を引き続き提供する可能性があるため、これだけに依存しないでください。
スレッド(または複数のスレッド)は、物事をスピードアップする(プールをチェック/成長させる)ためだけに役立つ場合がありますが、自分で仕事をするのには適していません。リクエストに応じてチェック/成長する必要があります。セカンダリスレッドはそれを回避するのに役立つだけです。