连接池隔天失效之异常处理

一、    开发环境

    测试平台:Linux 
       
    开发工具:Eclipse 3.x

    搭配环境:Struts2.x / Ibatis 2.0 / MySql / Tomcat6.0

二、    异常描述
    提示信息:
Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.net.SocketException
MESSAGE: Broken pipe

STACKTRACE:

java.net.SocketException: Broken pipe

    描述说明:
在使用UNSAP-WEBMAIL系统时,对邮箱进行增删改查操作,在一定时间内都可正常工作,但隔天再登陆WEBMAIL系统后,发现进行一些数据库操作时,连接失效,不能正常修改保存,抛出上面的异常。


三、    异常诊断
    分析:
经查找分析,在使用MySQL的Java连接池的过程中,连接一晚上不释放,第二天就会造成超时的错误,其原因是因为MySQL默认的空闲等待时间是8个小时,一旦空闲超过8个小时,就会强制行关闭该连接,而连接池中却依然保有该连接的有效引用,有数据访问时,使用一个经被MySQL强制关闭的连接就会抛出上面异常。

    诊断:
鉴于连接失接的问题,究其原因是因为连接超时或是空连接引起的异常,解决办法一、可以加长设置其等待的时间;办法二、优化连接池设置



四、    异常处理
    设置等时间:
在MySQL服务器的配置文件my.cnf中,默认方式下,其空闲等待时间是28800秒,即8个小时,当超过这个时段,则连接断开,加长设置其等时间,只需在配置文件my.cnf中的[mysqld]块中,加入如下两行
        wait_timeout = 2880000
        //空闲等时间的秒数
interactive_timeout = 2880000
        //服务器关闭交互式连接前等待活动的秒数
    优化连接池:

    环境一:IBATIS2.0 ,数据库连接池TYPE=“SIMPLE”

        <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"/>

1.    第一行,是否允许检测连接状态,设置其值为TRUE。
2.    第二行,数据库连接状态检测语句,越简单越好。
3.    第三行,对持续连接时间超过设定值(毫秒)的连接进行检测,0为不检测,减少系统消耗。
4.    第四行,对空闲超过设定值(毫秒)的连接进行检测,这里设为一个小时。

    环境二:IBATIS2.0 / SPRING 2.5,数据库连接池TYPE=“DBCP”

<property name="validationQuery"><value>
        select 1 from dual</value></property>
<property name="testOnBorrow"><value>true</value></property>

1.    第一行,数据库连接状态检测语句。
2. 第二行,是否允许检测连接状态,设为TURE

五、    附加
1)    MySQL配置文件相关:

1、配置文件位置:Windows下在%MySQL HOME%/bin下有mysql.ini配置文件,Linux系统下的配置文件为/etc/my.cnf。

2、配置文件设置:wait_timeout的取值范围是 1-2147483(Windows),1-31536000(linux),interactive_time取值随wait_timeout变动,它们的默认值都是28800。

2)    连接池设置:

     连接设优化设置中,IBATIS版本不同,所设置的参数名称也不相同,所以不可拿上面的设置通用于所有IBATIS版本。

你可能感兴趣的:(eclipse,spring,mysql,linux,ibatis)