長時間実行中の Hibernate トランザクションの実行中に発生するエラーについて言及しているのではないと仮定しています。
そうである場合、ソリューションは接続プールに直接関係していません。例外をキャッチする必要があります (正確にはどこにあるかは言うまでもありませんが、おそらくトランザクションを開始したレベルで)、トランザクションをロールバックし、成功するまで試行し続ける (つまり、新しいトランザクションを開始する) 必要があります。接続プールについて言及しているという事実は、c3p0 再接続設定に問題があることを示しているようです。
これが私の休止状態の接続パラメーターです(.propertiesファイルから、あなたのものはxmlにあるかもしれません)...
...
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost/db
hibernate.connection.username=user
hibernate.connection.password=password
hibernate.connection.provider_class=org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
hibernate.c3p0.minPoolSize=3
hibernate.c3p0.maxPoolSize=200
hibernate.c3p0.maxStatements=100
hibernate.c3p0.testConnectionOnCheckout=true
hibernate.c3p0.idleConnectionTestPeriod=300
...
c3p0 パラメータtestConnectionOnCheckout
とidleConnectionTestPeriod
. それらの詳細については、こちらをご覧ください。この投稿も関連しています。
Hibernate セッションを適切に閉じている (したがって、接続を接続プールに解放している) 場合、これらの設定により、アプリケーションの実行中に失われたデータベース接続を処理できます。
これらの構成設定を に追加した後でもデータベース接続に回復力がない場合は、ログを再確認して、実際に c3p0 プールを初期化していることを確認してください。これが表示されるはずです(を設定した後log4j.logger.com.mchange.v2=INFO
)...
INFO 2013-01-17 11:14:18,832 [メイン] com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource: c3p0 プールを初期化しています...
また、作業が終了したら、Hibernate セッションを適切に閉じていることを確認してください。これは、多くの休止状態セッションを一度に開く「パフォーマンス」テストを使用して (Web アプリを構築している場合は、一度に多くの HTTP 要求を送信することによって)、show processlist
MySQL コンソール内からの使用と組み合わせて使用することで確認できます (詳細については、こちらを参照してください)。情報)。
プロセスのリストが増え続ける場合は、接続を適切に解放していないため、接続プールを地球上に保存することはできません。