当前位置: 网学 > 编程文档 > MySQL > 正文

对付 MySQL 的死连接,Sleep的进程的来源探究

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/08/02
ql 服务就OK了文章来源: 近一段时间,部门同事反映在使用mysql 的过程出现数据库 连接问题  应用程序和数据库 建立连接,如果超过8小时应用程序不去访问数据库 ,数据库 就断掉连接 。这时再次访问就会抛出异常,如下所示: java.io.EOFExceptionat 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 | || net_read_timeout | 30 || net_write_timeout | 60 || slave_net_timeout | 3600 || wait_timeout | |+--------------------------+-------+ 同一时间,这两个参数只有一个起作用。到底是哪个参数起作用,和用户连接时指定的连接参数相关,缺省情况下是使用wait_timeout。我建议是将这两个参数都修改,以免引起不必要的麻烦。 2、修改参数这两个参数的默认值是8小时(60*60*8=)。我测试过将这两个参数改为0,结果出人意料,系统自动将这个值设置为1。换句话说,不能将该值设置为永久。将这2个参数设置为24小时(60*60*24=)即可。set interactive_timeout=;set wait_timeout=; 也可以修改my.cof修改后重起mysql 打开/etc/my.cnf在属性组mysqld下面添加参数如下:[mysqld]interactive_timeout=wait_timeout= 如果一段时间内没有数据库 访问则mysql 自身将切断连接,之后访问java访问连接池时对数据库 的数据通道早就关闭了,因为dbcp连接池无法时时维护与数据库 的连接关系,mysql 5以后即使在dbcp配置中加入autoReconnect=true也没有效果。 言归正传,接着来,shell脚本实现如下: #!/bin/sh注:这个脚本运行后会每五秒去检测一次 mysql 的sleep进程数 while :don=`/usr/bin/mysqladmin processlist | grep -i sleep | wc -l`date=`date +%Y%m%d[%H:%M:%S]`echo $n if [ "$n" -gt 10 ]thenfor i in `/usr/bin/mysqladmin processlist | grep -i sleep | awk '{print $2}'`do/usr/bin/mysqladmin kill $idoneecho "sleep is too many i killed it" >> /tmp/sleep.logecho "$date : $n" >> /tmp/sleep.logfisleep 5done crontab实现:不会循环的脚本(配合crontab使用) #!/bin/shn=`/usr/bin/mysqladmin processlist | grep -i sleep | wc -l`date=`date +%Y%m%d[%H:%M:%S]`echo $nif [ "$n" -gt 10 ]thenfor i in `/usr/bin/mysqladmin processlist | grep -i sleep | awk '{print $2}'`do/usr/bin/mysqladmin kill $idoneecho "sleep is too many i killed it" >> /tmp/sleep.logecho "$date : $n" >> /tmp/sleep.logfi  你可能还会用到查询mysql 当前连接数:1.show statusThreads_connected 当前的连接数Connections 试图连接到(不管
  • 下一篇资讯: 杀mysql sleep 进程的脚本
  • 网学推荐

    免费论文

    原创论文

    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号