让我描述一下我的问题 -
我有一个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参数在评论中
答案 0 :(得分:5)
答案 1 :(得分:3)
以下是我最终如何解决这个问题的说明 - http://vatsalad.wordpress.com/2010/09/28/hibernate-communications-link-error-c3p0mysql-and-broken-pipe-error/
答案 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/