Java MySQL/Hibernate随机具有;“通信链路故障”;

Java MySQL/Hibernate随机具有;“通信链路故障”;,java,mysql,hibernate,c3p0,Java,Mysql,Hibernate,C3p0,我们有一个运行Hibernate/C3PO 4.1.4.Final、Jetty、Java 6和Mysql 5.1.63的Web应用程序 javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException:通信链路 失败 从服务器成功接收的最后一个数据包是238519 几毫秒前。成功发送到服务器的最后一个数据包为 0毫秒前 我们的persistence.xml的属性部分如下所示 <

我们有一个运行Hibernate/C3PO 4.1.4.Final、Jetty、Java 6和Mysql 5.1.63的Web应用程序

javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException:通信链路 失败

从服务器成功接收的最后一个数据包是238519 几毫秒前。成功发送到服务器的最后一个数据包为 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都在几秒钟内运行


有人有什么想法吗

我们在生产服务器上也遇到了同样的问题。默认情况下,MySQL每8小时重置一次连接,因此我们几乎每8小时就会出现一次通信故障,因为我们使用计划的作业连续访问数据库。我们通过将“wait_timeout”增加到14天来解决这个问题,由于我们的维护计划是每15天进行一次,因此我们重新启动了MySQL服务器的数据库集群(我们已经准备好了主复制)。通过这种方法,在那之后我们没有收到任何通信链路故障。事实上,有时我们不会每隔15天重新启动服务器,但仍然没有错误(touch wood)。:)
根据您的描述,您似乎已将等待超时设置为10分钟,因此我猜您将得到时间差约为10分钟的错误。请注意,在等待超时后,没有必要在每次重置MySQL连接时都出现此错误。只有当您当时正在访问数据库时,它才会出现。:)

本文解释了修复方法。连接过期时,C3P0不会重新连接

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

我认为可能会有所帮助。如果是这种情况,增加
wait\u timeout
的值只会推迟出现更多的时间,而不是解决问题

问题可能与此有关:

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

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

托管Jetty和MySQL的计算机之间的通信有问题吗?某种类型的防火墙?你正在做什么交易导致这种情况?它们能持续多久?如果它们持续的时间超过MySQL超时时间,则尝试将事务分解为多个批处理事务。资料来源:去过那里,做到了(如果我描述的是这样的话:)。首先,你的mysql是否可以运行?这个参数是否指向正确的url-rp.config.db.url?是的,MySQL正在运行和工作。我们95%的时间都能打电话给它,但5%的时间它会随机掉线。