Communications link failure 解决办法


   
   
  1. 09: 00: 30.307 [http- 8080- 6] ERROR org.hibernate.transaction.JDBCTransaction -JDBC begin failed
  2. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
  3. The last packet successfully received from the server was 56, 237, 340 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago.
  4. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na: 1.6. 0_13]
  5. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java: 39) ~[na: 1.6. 0_13]
  6. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java: 27) ~[na: 1.6. 0_13]
  7. at java.lang.reflect.Constructor.newInstance(Constructor.java: 513) ~[na: 1.6. 0_13]
  8. at com.mysql.jdbc.Util.handleNewInstance(Util.java: 411) ~[mysql-connector-java- 5.1. 21.jar:na]
  9. at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java: 1117) ~[mysql-connector-java- 5.1. 21.jar:na]
  10. at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java: 3567) ~[mysql-connector-java- 5.1. 21.jar:na]
  11. at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java: 3456) ~[mysql-connector-java- 5.1. 21.jar:na]
  12. at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java: 3997) ~[mysql-connector-java- 5.1. 21.jar:na]
  13. at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java: 2468) ~[mysql-connector-java- 5.1. 21.jar:na]
  14. at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java: 2629) ~[mysql-connector-java- 5.1. 21.jar:na]
  15. at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java: 2713) ~[mysql-connector-java- 5.1. 21.jar:na]
  16. at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java: 5060) ~[mysql-connector-java- 5.1. 21.jar:na]
  17. at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java: 371) ~[commons-dbcp- 1.4.jar: 1.4]
  18. at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java: 328) ~[commons-dbcp- 1.4.jar: 1.4]
  19. at sun.reflect.GeneratedMethodAccessor55.invoke(Unknown Source) ~[na:na]
  20. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 25) ~[na: 1.6. 0_13]
  21. at java.lang.reflect.Method.invoke(Method.java: 597) ~[na: 1.6. 0_13]
  22. at net.bull.javamelody.JdbcWrapper$ConnectionInvocationHandler.invoke(JdbcWrapper.java: 185) ~[javamelody- 1.49. 0.jar:na]
  23. at net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler.invoke(JdbcWrapper.java: 282) ~[javamelody- 1.49. 0.jar:na]
  24. at $Proxy36.setAutoCommit(Unknown Source) ~[na:na]
  25. at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java: 91) ~[hibernate-core- 3.5. 6-Final.jar: 3.5. 6-Final]
  26. at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java: 1463) [hibernate-core- 3.5. 6-Final.jar: 3.5. 6-Final]
  27. at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java: 555) [spring-orm- 3.1. 1.RELEASE.jar: 3.1. 1.RELEASE]
  28. at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java: 371) [spring-tx- 3.1. 1.RELEASE.jar: 3.1. 1.RELEASE]
  29. at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java: 335) [spring-tx- 3.1. 1.RELEASE.jar: 3.1. 1.RELEASE]
  30. at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java: 105) [spring-tx- 3.1. 1.RELEASE.jar: 3.1. 1.RELEASE]
  31. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java: 172) [spring-aop- 3.1. 1.RELEASE.jar: 3.1. 1.RELEASE]
  32. at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java: 202) [spring-aop- 3.1. 1.RELEASE.jar: 3.1. 1.RELEASE]
  33. at $Proxy72.findPageByORMSearch(Unknown Source) [na:na]



网上看到这两个解决办法。验证中。

一是修改my.cnf: 
 
[ mysqld]  
wait_timeout=31536000  
interactive_timeout=31536000  
 
将过期时间修改为1年。 
 
二是在连接URL上添加参数:&autoReconnect=true&failOverReadOnly=false 


最终解决办法:URL添加参数貌似不管用,我用的是mysql5.6,网上说这个5以前的版本才有效。所以只能使用改mysql配置的方法了。

上述问题是由mysql5数据库的配置引起的。mysql5将其连接的等待时间(wait_timeout)缺省为8小时。在其客户程序中可以这样来查看其值: 

mysql﹥ 

mysql﹥ show global variables like 'wait_timeout'; 

+---------------+---------+ 

| Variable_name | Value | 

+---------------+---------+ 

| wait_timeout | 28800 | 

+---------------+---------+ 

1 row in set (0.00 sec) 


28800 seconds,也就是8小时。 

如果在wait_timeout秒期间内,数据库连接(java.sql.Connection)一直处于等待状态,mysql5就将该连接关闭。这时,你的Java应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就碰到上述错误。这解释了为什么我的程序第二天不能登录 的问题。 



本人觉得最简单的办法,就是对症下药:既然问题是由mysql5的全局变量wait_timeout的缺省值太小引起的,我们将其改大就好了。 

查看mysql5的手册,发现对wait_timeout的最大值分别是24天/365天(windows/linux)。以windows为 例,假设我们要将其设为21天,我们只要修改mysql5的配置文件“my.ini”(mysql5 installation dir),增加一行:wait_timeout=1814400

需要重新启动mysql5。 

linux系统配置文件:/etc/my.cnf 

测试显示问题解决了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值