2011-01-18 16 views
6

誰もが休止状態の接続を再確立/再試行する方法を知っていますか?たとえば、リモートDBがダウンしていて、アプリケーションを起動します。 Hibernateは接続を確立できません。それは失敗する。しかし、アプリケーションは閉じられていません。コネクトンを確立するためにもう一度試してみるために休止状態を言う方法はありますか?休止状態の接続を修復する

ありがとうございます。

答えて

1

C3P0は、休止状態の内部接続プールの実装です。

hibernateプロパティファイルに「hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider」 を追加します。それに応じてパラメータを設定するc3p0.propertiesファイルを作成します。このファイル& c3p0-x.jarはクラスパスになければなりません。

c3p0.properties

  • c3p0.idleConnectionTestPeriod:これは0より大きい数である場合には、C3P0は、この秒数を、すべてのアイドル、プールされたが、未チェックアウト接続をテストごとます。

  • c3p0.testConnectionOnCheckout:必要な場合にのみ使用してください。高価な。 trueの場合、すべての接続チェックアウト時に操作が実行され、接続が有効であることを確認します。より良い選択肢:idleConnectionTestPeriodを使用して接続を定期的に確認します。

hibernate.properties & c3p0.propertiesに設定することができ、他のいくつかのプロパティがあります。

+0

はい、これが私の第一歩でした。しかし、それは動作しませんでした。私はあなたが話していることすべてを行いましたが、結果はありませんでした。 DBがダウンしている場合、C3p0接続プールテスターは呼び出されません。 DBが動作していて、テスターが動作しているときにアプリケーションを起動し、接続状況を確認できることがわかりました。しかし、私はDBがダウンしている場合の対処方法を知りたい。私は、アプリケーションが接続プールをクレオートしようとしたが、いつの間にかそれがもう一度それをやろうとすると、succesがないことを意味した。 – Andrey

+0

DBがダウンしている場合は、acquireRetryAttempts回まで再試行します。各試行以降にacquireRetryDelayの遅延が発生すると、おそらく例外が発生します。 –

+0

はい、これは私が見るものです。 Hibernateは、acquireRetryAttempts回をacquireRetryDelay遅延で再接続しようとしますが、例外はありません。そして、私は理解する方法を理解していない休止状態は、DBに接続されているかどうかです。 – Andrey

18

あなたは本当にC3P0接続プールのために行く必要があります。http://www.mchange.com/projects/c3p0/index.html#configuring_recovery

まずあなたが適切に使用した場合には、Hibernateが起こらなければならない、C3P0を設定する必要があります。そのテーマに関するC3P0ドキュメントのセクションがありhttp://www.mchange.com/projects/c3p0/index.html#hibernate-specific

c3p0.propertiesファイルにあります。

あなたc3p0.propertiesで

は、データベースがダウンしているとき、無期限に3秒ごとに再接続を再試行するには、これらの特性を置く:

c3p0.acquireRetryAttempts = 0 
c3p0.acquireRetryDelay = 3000 
c3p0.breakAfterAcquireFailure = false 

また、接続の年齢の管理を使用し、無期限にあなたのプールに横たわって壊れた接続を避けるために:

c3p0.maxConnectionAge = 6000 
c3p0.maxIdleTime = 6000 
c3p0.maxIdleTimeExcessConnections = 1800 
c3p0.idleConnectionTestPeriod = 3600 

これらは、上記の場合、非常に高価が、役に立つかもしれ十分ではありません。

c3p0.testConnectionOnCheckout = true 
c3p0.preferredTestQuery = SELECT 1; 

あなたはまた、回復を妨げる接続リークをチェックすることもできます。

c3p0.debugUnreturnedConnectionStackTraces = true 

そして最後に、C3P​​0がで夢中にされていることを確認し、正しく休止状態「com.mchange」パッケージのデバッグログを有効にして、C3P0を伝えるかどうかを確認しますあなた自身について何かそれはロードされている構成プロパティを記述する必要があります。

こちらがお役に立てば幸いです。

0

をしてもよいし、あなたは()メソッド.getCurrentSession()代わり.openSessionを呼び出そうか?

接続が失敗した場合は、新しい接続を確立する必要があります。

こちらがお役に立てば幸いです。