6

Hibernate/C3PO 4.1.4.Final、Jetty、Java 6、Mysql 5.1.63 を実行する Web アプリケーションがあります。

javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: 通信リンク障害

サーバーから正常に受信された最後のパケットは、238,519 ミリ秒前でした。サーバーに正常に送信された最後のパケットは 0 ミリ秒前です。

persistence.xml のプロパティ セクションは次のようになります...

  <properties>
        <property name="hibernate.show_sql" value="false"/>
        <!--Begin Credentials -->
        <property name="hibernate.connection.url"
                  value="${rp.config.db.url}&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="hibernate.connection.username" value="${rp.config.db.user}"/>
        <property name="hibernate.connection.password" value="${rp.config.db.password}"/>
        <!--End Credentials -->
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.dialect" value="com.printlogix.rp.server.utils.Mysql5BitBooleanDialect"/>
        <property name="hibernate.hbm2ddl.auto" value="validate"/>
        <!--C3PO -->
        <property name="hibernate.connection.provider_class"
                  value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider"/>
        <property name="hibernate.c3p0.acquire_increment" value="25"/>
        <property name="hibernate.c3p0.idle_test_period" value="60"/>
        <property name="hibernate.c3p0.timeout" value="120"/>
        <property name="hibernate.c3p0.max_size" value="150"/>
        <property name="hibernate.c3p0.min_size" value="25"/>
        <property name="hibernate.c3p0.max_statement" value="0"/>
        <property name="hibernate.c3p0.preferredTestQuery" value="select 1;"/>

    </properties>

MySQL のタイムアウトは 600 秒に設定されています。これが1/5回どのように起こっているのかわかりません。サーバーの負荷はほとんどなく、データベースは比較的小さく、サーブレットはすべて数秒で実行されます。

誰にもアイデアはありますか?

4

3 に答える 3

3

この記事では、修正について説明します。C3P0 は、接続が期限切れになると再接続しません。

http://www.databasesandlife.com/automatic-reconnect-from-hibernate-to-mysql/

Hibernate の開発者がこれをより適切に文書化しないというのは、完全に狂っているように思えます。

于 2012-07-09T15:30:24.003 に答える
0

本番サーバーでも同じ問題に直面しました。デフォルトでは、MySQL は 8 時間ごとに接続をリセットするため、スケジュールされたジョブでデータベースに継続的にアクセスしていたため、ほぼ 8 時間ごとに通信障害が発生していました。「wait_timeout」を 14 日に増やすことで解決しました。メンテナンスは 15 日ごとにスケジュールされているため、DB クラスターである各 MySQL サーバーを再起動します (Master-Master レプリケーションが配置されています)。このアプローチにより、その後、通信リンクの障害は発生していません。実際、15 日ごとにサーバーを再起動しない場合もありますが、それでもエラーは発生しません (木に触れてください)。:) あなたの説明によると、wait_timeout を 10 分に設定しているように見えるので、約 10 分の時間差でエラーが発生すると思います。wait_timeout 後に MySQL 接続がリセットされるたびにこのエラーが発生する必要はないことに注意してください。その時点でデータベースにアクセスしている場合にのみ表示されます。:)

于 2012-07-07T07:52:59.707 に答える