基于Hibernate的Java Servlet应用程序中的Hibernate Communications Link失败,由MySQL提供支持

时间:2010-05-26 11:10:39

标签: java mysql hibernate jdbc

让我描述一下我的问题 -

我有一个Java应用程序 - Hibernate作为MySQL上的数据库接口层。我的应用程序中出现通信链接失败错误。发生此错误是一个非常具体的情况。我得到这个错误,当我让mysql服务器无人值守超过大约6个小时(即没有向MySQL发出超过大约6小时的查询)。我正在粘贴下面的顶级“异常”级别描述,并为详细的堆栈跟踪描述添加了一个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:Connection   拒绝:连接

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

我从这些异常声明中理解的是,MySQL在一段空闲/零活动后拒绝接受任何连接。我一直在通过谷歌搜索阅读一下这个,并且知道克服这一点的一种可能方法是设置c3p0属性的值,因为c3p0与Hibernate捆绑在一起。具体来说,我从这里读到http://www.mchange.com/projects/c3p0/index.html,设置两个属性idleConnectionTestPeriod和preferredTestQuery将为我解决这个问题。但这些价值似乎没有产生影响。

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

以下是stackoverflow.com上的相关Communications Link Failure问题,但我在答案中找不到满意的答案。 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure How to handle: Communication link failure

注1 - 当我连续使用我的应用程序时,我不会收到此错误。 注2 - 我使用JPA和Hibernate,因此我的hibernate.dialect等hibernate属性驻留在META-INF文件夹的persistence.xml中(这是否会阻止c3p0属性工作?)

编辑 -  我试过的c3p0参数在评论中

4 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

答案 2 :(得分:1)

即使我遇到了这个错误,只有在c3p0 config中启用autoReconnect = true后我才能解决它

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

答案 3 :(得分:0)

我用c3p0解决了通信链路故障。 我在下面的博客中解释说 org.hibernate版本必须等于c3p0版本, 所以这就是让我这一天的pom配置

+-----+-----+-----------------------------+
| id1 | id2 | dist                        |
+-----+-----+-----------------------------+
| 1   | 2   | d([a, b, ...], [c, d, ...]) |
+-----+-----+-----------------------------+
| 1   | 3   | d([a, b, ...], [e, f, ...]) |
+-----+-----+-----------------------------+
| 2   | 3   | d([c, d, ...], [e, f, ...]) |
+-----+-----+-----------------------------+
像他解释的那样,仅向hibernate.cfg.xml添加一个属性就足够了  获得c3p0汇集

<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>

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

相关问题