由 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 配置。 他们在这里 -我之前遇到过问题。看起来 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 通信链路故障的主要内容,如果未能解决你的问题,请参考以下文章