0

HibernateORM を使用して、mysql データベースに C3p0 接続プールを使用しています。

以下はhibernate.cfg.xmlの設定です

<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.maxConnectionAge">3600</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.max_size">300</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property>

そして、28800 秒後にデータベースに再接続するために、パラメータを設定しました -

c3p0.testConnectionOnCheckout=true

しかし、休止状態の例外に直面しています。

したがって、今 DB を呼び出して 8 時間 (または my.cnf の変数 wait_timeout を設定した時間) 待機すると、別の DB 呼び出しを行うと例外が発生します。スタックトレース -

org.hibernate.exception.JDBCConnectionException: could not execute query
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
        at org.hibernate.loader.Loader.doList(Loader.java:2536)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
        at org.hibernate.loader.Loader.list(Loader.java:2271)
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
        at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
        at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
        at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)

この問題の迅速な修正として、毎日朝にアプリ サーバーを再起動しています。

どんな助けでもいただければ幸いです

- ありがとう

4

1 に答える 1

0

あなたの設定があなたが考えているものである場合、これらの例外は、プールでアイドル状態になってタイムアウトした後にチェックアウトされる古い接続から発生する方法はありません. 接続は何があっても 1 時間後に期限切れになり、約 5 分以上アイドル状態になることはなく、チェックアウト時にテストされます。

次の 2 つのいずれかが進行中です。

1)あなたが持っていると思う設定がありません。あなたの設定と設定しようとしている c3p0 DataSource の中間で何かが間違っています。

幸いなことに、c3p0 データソースは初期化時に設定を INFO レベルでダンプします。ログを確認し、プールに意図した構成があることを確認します。

2) おそらく、あなたのアプリは接続を短期間チェックアウトして close() するのではなく、接続をプールの外でライブに保持している可能性があります。 c3p0 でできることは何もありません。ただし、c3p0 は、これが起こっているかどうかをテストするのに役立ちます。設定パラメータ unreturnedConnectionTimeout と debugUnreturnedConnectionStackTraces を試してください。一緒に使用してください。見る

http://www.mchange.com/projects/c3p0/#configuring_to_debug_and_workaround_broken_clients

http://www.mchange.com/projects/c3p0/index.html#unreturnedConnectionTimeout

http://www.mchange.com/projects/c3p0/index.html#debugUnreturnedConnectionStackTraces

幸運を!

于 2012-12-14T09:33:05.813 に答える