2

接続プーリングHibernateに withを使用しています。c3p0私はマルチシャードデータベース環境で作業しており、シャードのダウンタイムの可能性は現実的なユースケースシナリオであるため (たとえば、アプリケーションの外部の手段によるものです。たとえば、誰かが何らかの理由でシャードを停止しただけです)、c3p0 を使用しようとしています。データベース接続がダウンしていることを検出したら、Hibernate セッションを明示的に閉じて、マルチシャード スキャンで特定のシャードのセッションをスキップできるようにします。

呼び出しが意味のあるブール値を返すことができるSession.close()ように、接続がダウンしていることがわかったら呼び出して、Hibernate に通知するように c3p0 を構成する方法はありますか?Session.isOpen()

関連: org.hibernate.Session がまだ接続されていることを先制的かつ適切にチェックする (c3p0 経由)

4

1 に答える 1

3

短い答えはノーです。c3p0 はここでは役に立ちません。

(ここと前の質問を見て) c3p0 とは異なる目的で機能する何かを行っているように聞こえます。つまり、必要に応じてセッションを作成してからすぐに破棄するのではなく、長寿命のセッションを保持しています。そのようなものは非常に壊れやすいです。これは、避けるべき接続プールが存在するアーキテクチャです。

あなたの最良の選択、IMOは、「それをしないでください」です。セッションをまったくキャッシュしないでください。その後、通常の接続テスト (おそらく checkoutTimeout も設定) で問題が解決します。シャードがダウンしている場合、接続を取得しようとすると失敗します。それが最善の回避策である場合は、シャードをスキップできます。

c3p0 は休止状態について何も知りません。c3p0 の作成者は、彼の (私の) ライブラリを普及させてくれた hibernate に感謝していますが、c3p0 はセッションが何であるかを知りません。単なる接続です。理論的には、c3p0 が少し役立つ唯一の方法は、データベースがダウンしていることに気付いたときにイベントを報告できることです (構成によっては、非常に迅速または非常に遅くなる可能性があります)。セッションを close() することで、イベントに応答できます。

残念ながら、c3p0 は (まだ) ユーザーが取得の失敗に応答できるフックを提供していません。そうかもしれません — これは 0.9.6 で追加しようと考えている機能です。しかし、今はそうではありません。ただし、シャードをポーリングしてセッションを自分で閉じるものを実装するのは非常に簡単です。c3p0 が停止を通知するために行うことは、DriverManager.getConnection( ... ) または dataSource.getConnection() を呼び出して例外を観察することだけです。あなたはそれを自分で行うことができます!

ただし、最初の解決策を強くお勧めします。存続期間の長い Session オブジェクトを取り除きます。

于 2013-10-30T02:11:54.627 に答える