45IT.COM- 电脑学习从此开始!
DIY硬件教程攒机经验装机配置
设计Photoshop网页设计特效
系统注册表DOS系统命令其它
存储主板显卡外设键鼠内存
维修显卡CPU内存打印机
WinXPVistaWin7unix/linux
CPU光驱电源/散热显示器其它
修技主板硬盘键鼠显示器光驱
办公ExcelWordPowerPointWPS
编程数据库CSS脚本PHP
网络局域网QQ服务器
软件网络系统图像安全
页面导航: 首页 > 设计学院 > 网络编程 > 数据库 >

mysql超过8小时数据库断掉连接的简单解决办法

电脑软硬件应用网 45IT.COM 时间:2012-08-04 14:55 作者:蔡磊

我在做项目中发现一个规律,当应用程序和数据库建立连接时,如果超过了8个小时,应用程序句不会去访问数据库,数据库就会出现断掉连接的现象 。这时再次访问就会抛出异常.

1、一般的解决方法大多是在数据库连接字符串中增加“autoReconnect=true ”选项。但是这只对mysql4以前的版本有效。在最新的mysql中是无效的。其实要解决这个问题也有一个简单的方法,就是修改mysql的启动参数。缺省情况下mysql的timeout时间是28800秒,正好是8小时,增加一个0就可以了。
同理也可以在" my.ini"文件中增加此参数。
mysqld-nt --default-table-type=innodb --interactive_timeout=288000
2、从根源入手,设置mysql的wait_timeout为31536000(一年)。
   
mysql> show variables;
| wait_timeout                    | 28800
| interactive_timeout             | 28800    
" my.ini"文件中修改此参数
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000
重启服务,OK!

电脑软硬件应用网编辑发现的其它版本教程推荐,以下为网友博客jccg19890712的文章

 

应用程序和数据库建立连接,如果超过8小时应用程序不去访问数据库,数据库就断掉连接 。这时再次访问就会抛出异常,如下所示:

java.io.EOFException
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
...

查了一下发现应用程序和mysql数据库建立连接,如果超过8小时应用程序不去访问数据库,数据库就断掉连接 。这时再次访问就会抛出异常。

关于mysql自动断开的问题研究结果如下,在mysql中有相关参数设定,当数据库连接空闲一定时间后,服务器就会断开等待超时的连接:
1、相关参数,红色部分
mysql> show variables like '%timeout%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| connect_timeout          | 5     |
| delayed_insert_timeout   | 300   |
| innodb_lock_wait_timeout | 50    |
| interactive_timeout      | 28800 |
| net_read_timeout         | 30    |
| net_write_timeout        | 60    |
| slave_net_timeout        | 3600 |
| wait_timeout             | 28800 |
+--------------------------+-------+        
同一时间,这两个参数只有一个起作用。到底是哪个参数起作用,和用户连接时指定的连接参数相关,缺省情况下是使用wait_timeout。我建议是将这两个参数都修改,以免引起不必要的麻烦。

 

2、修改参数
这两个参数的默认值是8小时(60*60*8=28800)。我测试过将这两个参数改为0,结果出人意料,系统自动将这个值设置为1。换句话说,不能将该值设置为永久。
将这2个参数设置为24小时(60*60*24=604800)即可。
set interactive_timeout=604800;
set wait_timeout=604800;

也可以修改my.cof,修改后重起mysql
打开/etc/my.cnf,在属性组mysqld下面添加参数如下:
[mysqld]
interactive_timeout=28800000
wait_timeout=28800000

如果一段时间内没有数据库访问则mysql自身将切断连接,之后访问java访问连接池时对数据库的数据通道早就关闭了,因为dbcp连接池无法时时维护与数据库的连接关系,mysql5以后即使在dbcp配置中加入autoReconnect=true也没有效果。

其实愚蠢的版本就是直接加大这两个值

正确的解决方法是使用开源的proxool来取代tomcat的dbcp连接池


1、首先下载proxool 地址:http://proxool.sourceforge.net

2、解压缩proxool-0.9.0RC3.zip,拷贝lib下的所有jar库文件到你的工程下的WEB-INF/lib下,同时记得也把Mysql的jdbc驱动到web-info/lib

3、在WEB-INF下(别跑错地方)建立文件:proxool.xml
proxool.xml这个文件是用来设置别名的。
其中<proxool>标签就是别名的设置段。
alias是别名;
driver-url是驱动的url,就是连接的url;
driver-class是驱动的类,就是数据库驱动;
driver-properties是驱动的属性,可以设置登陆数据库的用户名和密码。maximum-connection-count是最大连接数;
house-keeping-sleep-time是proxool自动侦察各个连接状态的时间间隔(毫秒)属性,侦察到空闲的连接就马上回收,超时的销毁;
house-keeping-test-sql是proxool自动侦察各个连接状态是用的sql。
 

文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
    <proxool>
        <alias>crm</alias>
        <driver-url>
            jdbc:mysql://127.0.0.1:3306/crm?useUnicode=true&amp;autoReconnect=true&amp;characterEncoding=GBK
        </driver-url>
        <driver-class>com.mysql.jdbc.Driver</driver-class>
               
        <driver-properties>
            <property name="user" value="root" />
            <property name="password" value="" />
       </driver-properties>

        <maximum-connection-count>25</maximum-connection-count>
 <minimum-connection-count>5</minimum-connection-count>
 <house-keeping-sleep-time>60000</house-keeping-sleep-time>
        <house-keeping-test-sql>select 1</house-keeping-test-sql>

    </proxool>
</something-else-entirely>

4、在WEB-INF/web.xml中<web-app>节点里加入如下内容:
<servlet>
     <servlet-name>proxoolServletConfigurator</servlet-name>
 <servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
     <init-param>
       <param-name>xmlFile</param-name>
       <param-value>WEB-INF/proxool.xml</param-value><!--这里对应刚才建立的xml配置文件名-->
     </init-param>

<!--这里是servlte的启动优先级别,正数,数字越小越优先启动,如果有其他需要在启动时就得到Connection的servlte,一定记得要确保这个值是他们其中最小的并且不能同是一个优先级别,如果它是1,那其他servlte的一定要大于1,否则可能会出现proxool还没有完成池子之前servlte就请求Connection的情况!!会报莫名其妙的 No suitable driver found of  proxool-->
     <load-on-startup>1</load-on-startup>
   </servlet>
<!-- proxool提供的管理监控工具,可查看当前数据库连接情况-->
   <servlet>
    <servlet-name>Admin</servlet-name>
      <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
   </servlet>
   <servlet-mapping>
    <servlet-name>Admin</servlet-name>
    <url-pattern>/admin</url-pattern>
   </servlet-mapping>

 

5、在需要连接数据库时,只需要写:

Connection conn = DriverManager.getConnection("proxool.DBPool");

顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
无法在这个位置找到: baidushare.htm
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐知识