首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

关于 Communications link failure 的解决解决方法

2012-03-25 
关于 Communications link failure 的解决这个项目是基于SSH 框架,数据库是MYSQL ,服务器是TOMCAT,部署完

关于 Communications link failure 的解决

这个项目是基于SSH 框架,数据库是MYSQL ,服务器是TOMCAT,部署完成后,经过一段时间(估计约8小时,但不确定),当再次访问该项目,即:当与数据库再次连接时,就报下面这个异常,请各位帮忙分析解决,高分酬谢!

Java code
23:02:28,445 ERROR JDBCTransaction:67 - JDBC begin failedcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureLast packet sent to the server was 31 ms ago.    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)    at java.lang.reflect.Constructor.newInstance(Unknown Source)    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3009)    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2895)    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3438)    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2548)    at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4916)    at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:331)    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:317)    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:63)    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:510)    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:350)    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:262)    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)    at $Proxy26.findUserByUserNameAndPassword(Unknown Source)    at com.lenovo.mfgot.action.login.LoginAction.execute(LoginAction.java:56)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)    at java.lang.reflect.Method.invoke(Unknown Source)    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)


applicationContext_common.xml 部分如下:
XML code
..........省略部分........    <bean id="dataSource"        class="org.apache.commons.dbcp.BasicDataSource"        destroy-method="close">        <property name="driverClassName"            value="com.mysql.jdbc.Driver">        </property>        <property name="url"            value="jdbc:mysql://localhost:3306/mfgotv2">        </property>        <property name="username" value="root"></property>        <property name="password" value="javaweb2.0"></property>        <property name="maxActive" value="100"></property>        <property name="maxIdle" value="30"></property>        <property name="maxWait" value="-1"></property>        <property name="defaultAutoCommit" value="true"></property>    </bean>..........省略部分........ 



[解决办法]
http://andyao.javaeye.com/blog/38506

查看了Mysql的文档,以及Connector/J的文档以及在线说明发现,出现这种异常的原因是:

Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。

解决的方法有3种:

增加wait_timeout的时间。 
减少Connection pools中connection的lifetime。 
测试Connection pools中connection的有效性。 

[解决办法]
这个主要还是8小时连接问题
解决方案挺多
修改wait_timeout的方案
在 MS-DOC 中 MySql 5.0\bin 目录下运行 :mysqld --verbose --help ,得到 MySql 的参数配置。从中看到 wait_timeout = 28800 ,也就是8小时。如果超过 8 小时,没有对数据库进行操作,数据连接就会自动断开。
解决方法一:
可以在 my.ini 文件中启动项中添加 wait_timeout = 86400 任意值来设置等待时间。
其他解决方案
http://hi.baidu.com/ejiasoft/blog/item/3314da6d692600fd421694bb.html

热点排行