MySQL / Hibernate随机出现“通信链路故障”

时间:2012-06-22 22:45:35

标签: java mysql hibernate c3p0

我们有一个运行Hibernate / C3PO 4.1.4.Final,Jetty,Java 6和Mysql 5.1.63的webapp。

  

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都在几秒钟内运行。

有人有什么想法吗?

3 个答案:

答案 0 :(得分:3)

本文解释了此修复程序。连接过期时C3P0不会重新连接。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我认为this post可能有所帮助。如果是这种情况,增加wait_timeout的值只会推迟发生更多的时间,而不是解决问题。

问题可能与此有关:

  • 您打开一个休眠会话
  • 做一些比数据库wait_timeout的值花费更多时间的事情
  • 您尝试使用此hibernate会话。您在此处评论的消息将显示

如果您有兴趣,我已在here中记录了一个案例。