私は現在Javaアプリケーションに取り組んでいます。Spring
とを備えたスタンドアロン クライアントHibernate
です。またC3P0
。
以前のバージョンでは、データベース接続に標準ユーザー (構成ファイルにハードコーディング) を使用していましたが、現在はすべてのユーザーが自分の資格情報を提供する必要があるように変更されています。
データベースのコードを含む Bean は、基本的にオンデマンドで作成されます。
XML ファイルを変更し、資格情報と接続設定を設定するポストプロセッサを追加しました。これは次のようになります。
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();
configurer = new PropertyPlaceholderConfigurer();
// properties are retrieved from a private method
configurer.setProperties(getProperties());
context.addBeanFactoryPostProcessor(configurer);
context.setConfigLocations(new String[] { "first.xml","second.xml" });
context.refresh();
return context.getBean("myClass", MyClass.class);
これはすべて期待どおりに機能しますが、現在行き詰まっている部分に到達しました。
ユーザーがボタンをクリックすると、資格情報が受け入れられたかどうかが通知されるように、接続のテスト機能を提供したいと考えています。
私の最初のアイデアは、データベースで単純な選択を行うことでした。ただし、ログをふるいにかけると、Spring がrefresh()
とにかく (またはむしろ Bean のインスタンス化中に) データベースに接続しようとしていることに気付きました。たとえば、ログに例外が表示されます。
java.sql.SQLException: Connections could not be acquired from the underlying database!
残念ながら、Spring は実際には気にしていないようです。例外はログに記録されますがrefresh()
、このため終了し、例外はスローされません。単純に例外をキャッチできれば、接続が失敗したことがわかるだろうと思っていました。
計画どおりに選択を行うこともできますが、接続試行をできるだけ制限したいと考えています。これは、データベース サーバーが数回の試行後にユーザーをブロックするためです。試行回数が多すぎる場合でも永続的です(接続プールの設定を変更する前に、すでにそれを楽しんでいました)。
この問題に関する私の検索では、ほとんど何も見つかりませんでした。どういうわけか例外を取得する方法はありますか? または、Spring は、インスタンス化/更新中の接続エラーについて教えてくれるような API を提供していますか?
それができない場合、代替アプローチのアイデアはありますか? できれば、接続が可能かどうかを判断するために 1 回だけ試行する必要があります。
編集:興味のある人のために:私はSantoshからの提案に行き、で接続テストを実装しましたJDBC
.
残念ながら、Bean のインスタンス化中に発生したデータベース エラー/例外を利用する簡単な方法はないようです。