あるソースから常にデータを抽出してデータベースに書き込むプログラムに、c3p0でhibernate3を使用しています。ここで問題となるのは、何らかの理由でデータベースが使用できなくなる可能性があることです(最も単純なケースでは、単にデータベースをシャットダウンします)。
データベースに何かが書き込まれようとしている場合でも、例外はありません。クエリは、データベースが再び使用可能になるまで、永遠に待機する必要があります。私が間違っていない場合、これは接続プールが私のためにできることの1つです。データベースに問題がある場合は、接続を再試行してください。最悪の場合、無限大です。
しかし、代わりに、壊れたパイプの例外が発生し、接続が拒否された後、例外が自分のコードに渡されることがありますが、これは発生しないはずです。
例外をキャッチした場合でも、どうすれば休止状態をクリーンに再初期化できますか?(これまでのところ、c3p0を使用せずに、セッションファクトリを再構築しただけですが、接続がリークする可能性がある場合でも驚かないでしょう(またはそうしても大丈夫ですか?))。
データベースはVirtuosoオープンソース版です。
私のhibernate.xml.cfgc3p0構成:
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.breakAfterAcquireFailure">false</property>
<property name="hibernate.c3p0.acquireRetryAttempts">-1</property>
<property name="hibernate.c3p0.acquireRetryDelay">30000</property>
<property name="hibernate.c3p0.automaticTestTable">my_test_table</property>
<property name="hibernate.c3p0.initialPoolSize">3</property>
<property name="hibernate.c3p0.minPoolSize">3</property>
<property name="hibernate.c3p0.maxPoolSize">10</property>
ところで:テストテーブルが作成され、大量のデバッグ出力が得られるので、実際に構成を読み取っているようです。