关于 No operations allowed after connection closed.错误

本人用struts+jDBC+tomcat+mysql 做了个小型网站,刚开始挂上去时没有问题,等过三天左右就会报No operations allowed after connection closed.错误

报错如下:javax.servlet.ServletException: java.sql.SQLException: No operations allowed after connection closed.

Connection was closed due to the following exception:

** BEGIN NESTED EXCEPTION ** 

java.sql.SQLException
MESSAGE: Communication link failure: java.net.SocketException, underlying cause: Software caused connection abort: recv failed

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: Software caused connection abort: recv failed

 

后经网上查找发现原因:

 

出现这种异常的原因是:Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有 Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。
自己测试了一下,在mysql 的配置文件my.ini中在
[mysqld]下添加
wait_timeout=100  服务器关闭交互式连接前等待活动的秒数

  interactive_timeout=100   服务器关闭非交互连接之前等待活动的秒数

 

 

两个参数,即将mysql默认的链接等待时间由8小时改为100秒,登录网站,确实有如上错误出现。

 

解决方案:1、换一下JDBC驱动,JDBC3.1.0-alpha及以前版本会出现此问题,下载新的JDBC驱动

 

2、使用hibernate配置:

 

使用hibernate: 
true   
true 
true 
加入以上property,可解决此问题,如果未使用hibernate等持久化管理框架,可在mysql的url中加入autoReconnect=true,这样就可以解决(源自iteye 信仰的力量)

 

 

 

抱歉上述方法可行性有问题,现改变:

 

原因很简单。在对数据库操作结束后关闭连接是正确的做法,没什么大问题。至于出现:No operations allowed after connection closed。这样的问题原因只有一个,你这里和数据库的连接Connection是一个Static的,程序共享这一个Connection。所以第一次对数据库操作没问题,当把Connection关闭后,第二次还想操作数据库时Connection肯定不存在了。(源自CSDN 小荷初现)

 

有没有更好的方法,请各位指点一下

你可能感兴趣的:(关于 No operations allowed after connection closed.错误)