1

私は現在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 のインスタンス化中に発生したデータベース エラー/例外を利用する簡単な方法はないようです。

4

1 に答える 1

1
  1. あなたが探している種類の機能は、spring+hibernateを使用して達成するのは非常に難しいでしょう。
  2. 接続プロパティはセッションファクトリレベルで設定され、資格情報が正しくない場合、セッションファクトリはインスタンス化されません。
  3. ここで彼の答えから@Bozoを引用します。

    あなたができることはLocalSessionFactoryBean、メソッドを拡張してオーバーライドし 、sessionFactoryがnullの場合に、(またはCGLIB / javassistgetObject()を介して)プロキシを返すようにすること です。java.lang.reflect.ProxyそうSessionFactoryすれば、が注入されます。プロキシは、SessionFactory最初はnullであるベアへの参照を保持する必要があります。プロキシが接続を要求されるたびに、sessionFacotryがまだnullの場合は、buildSessionFactory() (のLocalSessionFactoryBean)を呼び出してプロキシに委任します。それ以外の場合は、例外をスローします。(もちろん、現在のBeanの代わりに新しいファクトリBeanをマップします)

  4. を作成する前に、生のJDBC呼び出しを使用して接続を取得しようとする単純で基本的なアプローチもあります。ClassPathXmlApplicationContextそれが成功した場合は、続行するか、適切なメッセージを使用してください。

  5. 完全に制御できるため、ここで接続の試行を制限できます。
于 2012-09-03T10:53:17.267 に答える