0

C3P0接続プールを使用しています。C3P0ConnectionProviderを拡張するクラスTestConnectionProviderを追加しました。私が欲しいのは、例外がキャッチされた後でも、Hibernateは再接続を試行する必要があるということです。ただし、例外をキャッチした後、アプリケーションは停止します。

シーケンスは次のとおりです。1)MySQL接続が停止します。2)Hibernateは何度も再接続を試みます。3)MySQL接続を開始します。4)Hibernateは接続を取得し、データの挿入を開始します。5)接続を再開しました。6)Hibernateは、私のアプリケーションではキャッチされない例外をスローします。

私が達成したいのは、Hibernateが接続を失うときはいつでも、アプリケーションの例外処理メカニズムによって処理され、接続が開始時またはその間に利用できないかどうかにかかわらず、再接続を試みる必要があることです。

4

1 に答える 1

1

長時間実行中の 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 パラメータtestConnectionOnCheckoutidleConnectionTestPeriod. それらの詳細については、こちらをご覧ください。この投稿も関連しています。

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 processlistMySQL コンソール内からの使用と組み合わせて使用​​することで確認できます (詳細については、こちらを参照してください)。情報)。

プロセスのリストが増え続ける場合は、接続を適切に解放していないため、接続プールを地球上に保存することはできません。

于 2013-01-17T01:59:03.003 に答える