由 MySQL 提供支持的基于 Hibernate 的 Java Servlet 应用程序中的 Hibernate 通信链路故障

Posted

技术标签:

【中文标题】由 MySQL 提供支持的基于 Hibernate 的 Java Servlet 应用程序中的 Hibernate 通信链路故障【英文标题】:Hibernate Communications Link Failure in Hibernate Based Java Servlet application powered by MySQL 【发布时间】:2011-02-24 03:14:10 【问题描述】:

让我描述一下我的问题 -

我有一个 Java 应用程序 - Hibernate 作为 mysql 上的数据库接口层。我的应用程序中出现通信链路故障错误。这个错误的发生是一个非常具体的案例。我收到此错误,当我让 mysql 服务器无人看管超过大约 6 小时(即超过大约 6 小时没有向 MySQL 发出查询时)。我在下面粘贴了一个***“异常”级别的描述,并添加了一个 pastebin 链接以获取详细的堆栈跟踪描述。

javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: 无法打开连接 - 引起:org.hibernate.exception.JDBCConnectionException: 无法打开连接 - 引起:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯链路故障 - 从服务器成功接收的最后一个数据包是 1,274,868,181,212 毫秒前。 最后一个数据包成功发送到 服务器是 0 毫秒前。 - 引起:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯链路故障 - 从服务器成功接收的最后一个数据包是 1,274,868,181,212 毫秒前。 最后一个数据包成功发送到 服务器是 0 毫秒前。 - 原因:java.net.ConnectException:连接 拒绝:连接

用于进一步调查的 pastebin 链接 - http://pastebin.com/4KujAmgD

我从这些异常语句中了解到,MySQL 在一段时间的空闲/无活动之后拒绝接收任何连接。我一直在通过谷歌搜索阅读有关此内容的信息,并了解到克服此问题的一种可能方法是设置 c3p0 属性的值,因为 c3p0 与 Hibernate 捆绑在一起。具体来说,我从这里http://www.mchange.com/projects/c3p0/index.html 读到,设置两个属性 idleConnectionTestPeriod 和 preferredTestQuery 将为我解决这个问题。但这些值似乎没有产生影响。

这是解决此问题的正确方法吗?如果没有,克服这个问题的正确方法是什么?

以下是 ***.com 上相关的通信链接故障问题,但我在他们的回答中没有找到令人满意的答案。 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure How to handle: Communication link failure

注意 1 - 当我连续使用我的应用程序时,我没有收到此错误。 注 2 - 我将 JPA 与 Hibernate 一起使用,因此我的 hibernate.dialect 等休眠属性位于 META-INF 文件夹中的 persistence.xml 中(这会阻止 c3p0 属性工作吗?)

编辑 - 我试过的c3p0参数在cmets里

【问题讨论】:

请更新您的问题以包含完整的 Hibernate c3p0 配置。 他们在这里 - 选择1;2 【参考方案1】:

我之前遇到过问题。看起来 MySQL 服务器超时了您的连接。 超时默认为 28800,即 8 小时。请参阅此链接了解更多详情。

http://shengchien.blogspot.com/2009/10/hibernate-c3p0-and-mysql.html

希望对你有用。

【讨论】:

让我试试这个,我会告诉你的,谢谢盛【参考方案2】:

即使我遇到了这个错误,我也是在 c3p0 配置中启用 autoReconnect=true 后才解决的

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ex_app?autoReconnect=true</property>

【讨论】:

【参考方案3】:

我用 c3p0 解决了我的通信链接故障。 我看到下面的博客解释说 org.hibernate 版本必须等于 c3p0 版本, 这就是让我开心的 pom 配置

<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.6.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
     <artifactId>hibernate-entitymanager</artifactId>
     <version>4.3.1.Final</version>
 </dependency>
<dependency>
 <groupId>org.hibernate</groupId>
  <artifactId>hibernate-c3p0</artifactId>
 <version>4.3.6.Final</version>
</dependency>

  <dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
   <version>0.9.1.2</version>
</dependency>

就像他解释的那样,只向 hibernate.cfg.xml 添加一个属性就足够了 获得 c3p0 池

       <property name="hibernate.c3p0.min_size">10</property>

之后不再出现“通信链接错误”、“预计读取 5 个字节,读取 0”。 这是链接:https://howtodoinjava.com/hibernate/hibernate-c3p0-connection-pool-configuration-tutorial/

【讨论】:

【参考方案4】:

对我来说,我将 Java SE 运行时环境降级到 1.8.0_281 并且工作正常。

【讨论】:

以上是关于由 MySQL 提供支持的基于 Hibernate 的 Java Servlet 应用程序中的 Hibernate 通信链路故障的主要内容,如果未能解决你的问题,请参考以下文章

hibernate中的主键生成策略

hibernate中的主键生成策略

Hibernate笔试总结

Hibernate试题解析

hibernate中实体类注解

Hibernate内测总结