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 次。服务器负载很小,数据库相对较小,servlet 都在几秒钟内运行。

有人有什么想法吗?

4

3 回答 3

3

这篇文章解释了修复。当连接过期时,C3P0 不会重新连接。

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

Hibernate 的开发人员不会更好地记录这一点,这似乎完全是疯了。

于 2012-07-09T15:30:24.003 回答
0

我认为这篇文章可能会有所帮助。如果是这样,增加 的值wait_timeout只会推迟更多的时间,而不是解决问题。

问题可能与此有关:

如果您有兴趣,我在这里记录了一个案例。

于 2013-09-03T15:10:51.833 回答
0

我们在生产服务器上也遇到了同样的问题。默认情况下,MySQL 每 8 小时重置一次连接,因此我们几乎每 8 小时就会出现一次通信故障,因为我们正在使用预定的作业连续访问数据库。我们通过将“wait_timeout”增加到 14 天来解决它,并且由于我们的维护计划每 15 天进行一次,我们重新启动每个 MySQL 服务器是我们的数据库集群(我们有 Master-Master 复制)。使用方法之后,我们没有遇到任何通信链路故障。实际上,有时我们不会每 15 天重新启动一次服务器,但仍然没有错误(触摸木头)。:) 根据您的描述,您似乎已将 wait_timeout 设置为 10 分钟,所以我猜您会收到时差约为 10 分钟的错误。请注意,在 wait_timeout 之后每次重置 MySQL 连接时,不必出现此错误。仅当您当时正在访问数据库时才会出现。:)

于 2012-07-07T07:52:59.707 回答