`

MYSQL连接8小时未动出现连接错误解决办法

 
阅读更多

ibatis数据库连接报错No operations allowed after connection closed.Connection was implicitly closed

数据库连接出错信息有下面两条:

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>

=================================================================================

 

iBatis自己带了一个simple的数据库连接池,基本的功能都有。但是在处理部分数据库(比如mysql)的连接空闲时间太长(mysql是8小时)自动超时的时候,就比不上象c3p0这样的连接池软件了(c3p0能自动处理数据库连接被关闭的情况)。
我目前采用的方法是iBatis本身提供的一种算得上是取巧的办法,基本思想就是每隔一段时间往数据库发一条查询语句,这样使得数据库空闲时间不会太长,而使得其自动关闭。
方法是在SqlMapConfig.xml的dataSource进行如下配置:
<dataSource type="SIMPLE">
    <property name="JDBC.Driver" value="${jdbc.driverClassName}"/>
    <property name="JDBC.ConnectionURL" value="${jdbc.url}"/>
    <property name="JDBC.Username" value="${jdbc.username}"/>
    <property name="JDBC.Password" value="${jdbc.password}"/>
    <property name="Pool.PingEnabled" value="true"/>
    <property name="Pool.PingQuery" value="select 1"/>
    <property name="Pool.PingConnectionsOlderThan" value="0"/>
    <property name="Pool.PingConnectionsNotUsedFor" value="3600000"/>
</dataSource>
开始的3行是关于数据库连接信息的,不需要说明了。
Pool.PingEnabled:是用于设置开启是否允许检测连接状态
Pool.PingQuery:是用于检测连接的查询语名,当然是越简单越好
Pool.PingConnectionOlderThan:对持续连接时间超过设定值(毫秒)的连接进行检测,我将其设置为0(不进行此项检测),否则,iBatis在超过这个时间后,执行每个sql以前检测连接,对于性能可能会有一定的影响。
Pool.PingConnectionsNotUsedFor:对空闲超过设定值(毫秒)的连接进行检测,我设置为1小时(mysql缺省的关闭时间是8小时)

当然,还有一个办法是使用c3p0这样的连接池
但是需要自己写一部分代码,实现以下接口:

public interface DataSourceFactory {
public void initialize(Map map);
public DataSource getDataSource();
}



分享到:
评论

相关推荐

    基于MySQL的数据库中间件Meituan-DBProxy.zip

    解决了绑定后端连接断开时,客户端连接未及时断开的问题 屏蔽了KILL语句,避免在后端MySQL可能误KILL的问题 修改了事务内语句执行错误时,DBProxy未保留后台连接导致rollback发送到其它结点的问题...

    PHP和MySQL Web开发第4版pdf以及源码

    16.3.2 受影响机器的未知情用户 16.3.3 对公司不满的员工 16.3.4 硬件被盗 16.3.5 我们自身 16.4 代码的安全性 16.4.1 过滤用户输入 16.4.2 转义输出 16.4.3 代码组织 16.4.4 代码自身的问题 16.4.5 文件系统因素 ...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...

    PHP和MySQL WEB开发(第4版)

    16.3.2 受影响机器的未知情用户 16.3.3 对公司不满的员工 16.3.4 硬件被盗 16.3.5 我们自身 16.4 代码的安全性 16.4.1 过滤用户输入 16.4.2 转义输出 16.4.3 代码组织 16.4.4 代码自身的问题 16.4.5 文件系统因素 ...

    PHP和MySQL Web开发第4版

    16.3.2 受影响机器的未知情用户 16.3.3 对公司不满的员工 16.3.4 硬件被盗 16.3.5 我们自身 16.4 代码的安全性 16.4.1 过滤用户输入 16.4.2 转义输出 16.4.3 代码组织 16.4.4 代码自身的问题 16.4.5 文件系统因素 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHPCMS 2008 SP2 正式版.zip

    8、 "FCKLang 未定义"错误的解决办法问题:属编码问题,在本机使用记事本打开fckeditor\editor\lang\zh-cn.js,不用修改任何内容,重新保存后上传服务器覆盖原文件即可解决。 9、 修正了栏目设置中在 是否添加水印...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    9. 步骤8/8:完成安装  卸载Oracle 1. 在运行services.msc打开服务,停止Oracle的所有服务。 2. oracle11G自带一个卸载批处理\app\Administrator\product\11.2.0\dbhome_1\deinstall\deinstall.bat 3. 运行该...

    易语言程序免安装版下载

    易语言5.1 相对于易语言5.0更新说明: ... 修改XML解析支持库,增加写出CDATA数据功能,解决解析XML时错误的丢弃换行和TAB字符的BUG,解决读取节点值时对CDATA数据进行转义处理的BUG。 20. 修改扩展界面支持库...

    PhpCMS2008 SP2 build20090820简体中文 UTF-8

    8、'FCKLang未定义'错误的解决办法问题:属编码问题,在本机使用记事本打开fckeditor\editor\lang\zh-cn.js,不用修改任何内容,重新保存后上传服务器覆盖原文件即可解决。 9、修正了栏目设置中在是否添加水印设置...

    开涛高可用高并发-亿级流量核心技术

    16.7.11 网络抖动时,返回502错误 346 16.7.12 机器流量太大 346 16.8 其他 347 17 京东商品详情页服务闭环实践 348 17.1 为什么需要统一服务 348 17.2 整体架构 349 17.3 一些架构思路和总结 350 17.3.1 两种读服务...

    FTP服务器程序

    UNIX系统保存了每个用户的详细资料,包括E-mail地址、帐号,在现实生活中的真实姓名、登录时间、有没有未阅读的信件,最后一次阅读E-mail的时间以及外出时的留言等资料。当你用Finger命令查询时,系统会将上述资料...

    PhpCMS2008 SP2 build20090820 简体中文GBK

    8、'FCKLang未定义'错误的解决办法问题:属编码问题,在本机使用记事本打开fckeditor\editor\lang\zh-cn.js,不用修改任何内容,重新保存后上传服务器覆盖原文件即可解决。 9、修正了栏目设置中在是否添加水印设置...

    蚂蚁分类信息系统 mymps v1.6 UTF-8.zip

    七,系统配置页 网站统计填写可能出现系统错误的BUG 八,安装的初始数据库包含网站配置信息 九,信息发布成功提示页,排版BUG 十,首页友情链接处,若未添加图片链接,显示大片空白的BUG 十一,首页调整了左栏...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    每个实例都是经过笔者精心筛选的,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。 本书两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;本书实例来源...

Global site tag (gtag.js) - Google Analytics