数据库连接出错信息有下面两条:
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
com.mysql.jdbc.CommunicationsException: Communications link failure
================分割线================
一直想不出什么原因导致,网上查资料也不顺利,后来找到了hibernate连接数据库,产生同样的错误时的处理方法,知道了问题出在哪里:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
查看了Mysql的文档,以及Connector/J的文档以及在线说明发现,出现这种异常的原因是:Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有 Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。
上网搜索,在MySQL的论坛上找到一个办法,就是如果在执行sql语句的时候发生了上述异常,就将sql语句重新执行一次。
试验发现,这个办法对这个使用spring+hibernate的服务无效。
进一步搜索发现,MySQL官方不推荐使用autoReconnect=true,参见http://bugs.mysql.com/bug.php?id=5020
需要另外找别的办法来解决这个问题。
由于问题产生的根本原因在于服务到数据库的连接长时间没活动,既然重新连接的办法无效,就可以尝试另外一种办法,就是反空闲。
自己写一个线程来反空闲的话,比较麻烦。
最后在网上找到一个办法。为hibernate配置连接池,推荐用c3p0,然后配置c3p0的反空闲设置idle_test_period,只要小于MySQL的wait timeout即可。
在hibernate.cfg.xml中增加下面几项:
<!-- configuration pool via c3p0-->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">30</property>
<property name="c3p0.time_out">1800</property> <!-- seconds --><!-- default: 0 -->
<property name="c3p0.max_statement">50</property> <!-- default: 0 -->
<property name="c3p0.acquire_increment">1</property> <!-- default: 1 -->
<property name="c3p0.idle_test_period">120</property> <!-- seconds --><!-- default: 0 -->
<property name="c3p0.validate">true</property>
修改完后测试,问题解决。
================分割线================
具体修改方法如下:
对于MySQL5之前的版本,如Mysql4.x,只需要修改连接池配置中的URL,添加一个参数:autoReconnect=true(如jdbc:mysql://hostaddress:3306/schemaname?autoReconnect=true),如果是MySQL5及以后的版本,则需要修改my.cnf(或者my.ini)文件,在[mysqld]后面添加上:
wait_timeout = n
interactive-timeout = n
(n为服务器关闭交互式连接前等待活动的秒数。可是就部署而言每次修改my.ini比较麻烦,而且n等于多少才是合适的呢?所以这个解决办法不好。)
查ibatis文档后修改如下,红字部分是修改的重点:
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL"
value="jdbc:mysql://192.168.1.4:3306/mail?characterEncoding=utf-8" />
<property name="JDBC.Username" value="abc" />
<property name="JDBC.Password" value="abc" />
<property name="Pool.MaximumActiveConnections" value="10" />
<property name="Pool.MaximumIdleConnections" value="5" />
<property name="Pool.MaximumCheckoutTime" value="120000" />
<property name="Pool.TimeToWait" value="500" />
<property name="Pool.PingQuery" value="select 1 from redirect_url" />
<property name="Pool.PingEnabled" value="true" />
<property name="Pool.PingConnectionsOlderThan" value="0" />
<property name="Pool.PingConnectionsNotUsedFor" value="3600000" /><!-- 对于空闲的连接一个小时检查一次 -->
</dataSource>
</transactionManager>
分享到:
相关推荐
Mybatis报错: org.apache.ibatis.exceptions.PersistenceException解决办法 一、问题描述 写好配置文件用JUnit进行测试,一运行就报错: org.apache.ibatis.exceptions.PersistenceException: ### Error querying ...
ibatis数据库连接的小案例,自己看视频做的,感觉做的还可以,挺不错的,要的话可以下载去参考下,
运用IBATIS在三层架构的基础上建立的数据库连接,主要是一个框架,突出重点,一看就明白。最适合初学者快速学习使用,里面的条路清晰。
Ibatis连接ORACLE数据库的小例子
IBATIS连接多数据库参考文档,只供参考,学习。
ibatis-2.3.4.726.jar,ibatis-2.3.0.677.jar,ibatis-2.3.3.720.jar下载,都已放入一个压缩包下。
ibatis的错误总结
在用iBatis.net与数据库打交道的过程中,发现iBatis.net拼接字符串不能直接拷贝然后在dbms里执行
操作数据库 iBATIS查询,java 和spring的配置方法
ibatis做连接查询 .doc
使用Struts1.2+IBatis对数据库表进行增、删、改、查操作; 有清晰的案例使用说明,完整的案例, 直接可以附加看效果。 案例作者:宋海康
IBatis.DataMapper.1.6.2 和 IBatis.DataMapper.1.9 开发包
Ibatis连接MySQL数据库实例 有代码 项目下下来直接跑就行了,不过要修改数据库配置信息哦 跑不起来我吃翔三斤
C#中iBatis连接mySQL使用的DLL
2.数据库链接统一放在“config/ibatis/properties.config”里面。 3.使用前请先建立表Student与Teacher,表中字段请参照各自的StudentMap.xml、TeacherMap.xml。 4.通过log4net记录错误日志,出错时会打印执行的sql...
ibatis-2.3.3.720.jar
ibatis数据库笔记,自己学ibatis时记下的,希望对你有所帮助
Manning.iBATIS.in.Action.Jan.2007.eBook-BBL.pdf Manning.iBATIS.in.Action.Jan.2007.eBook-BBL.pdf Manning.iBATIS.in.Action.Jan.2007.eBook-BBL.pdf
开源ibator什么xml和pojo的时候,经常会带一些讨厌的注释还有一些没用的ibatorgenerator等的,我改了它的源代码,弄了个干净的ibator