root用户登陆mysql之后,可以使用showfullprocesslist语句可以显示所有正在连接的用户,然后使用kill<ID语句可以删除指定的连接。要一次断开所有的连接,需要用PHP等语言编写程序,批处理不好写。错误“Too many connections”。平常碰到这个问题,我基本上是修改/etc/my.cnf的max_connections参数,然后
重启数据库。但是生产服务器上数据库又不能随便重启。没办法,只好想办法手动去释放一些没用的连接。登陆到MySQL的提示符下,数据show processlist这个命令,可以得到所以连接到这个服务器上的MySQL连接:mysql>show processlist+---------+------+---------------------+---------+---------+------+-------+-------------------+| Id | User | Host| db | Command | Time | State | Info |+---------+------+---------------------+---------+---------+------+-------+-------------------+| 1180421 | ur | 202.103.96.68:49754 | test1 | Sleep |1 | | NULL || 1180427 | ur | 202.103.96.68:55079 | test2 | Sleep |1 | | NULL || 1180429 | ur | 202.103.96.68:55187 | testdba | Sleep |0 | | NULL || 1180431 | ur | 202.103.96.68:55704 | testdba | Sleep |0 | | NULL || 1180437 | ur | 202.103.96.68:32825 | test1 | Sleep |1 | | NULL || 1180469 | ur | 202.103.96.68:58073 | testdba | Sleep |0 | | NULL || 1180472 | ur | 83.136.93.131:47613 | test2 | Sleep |8 | | NULL || 1180475 | root | localhost | NULL| Query |0 | NULL | show PROCESSLIST |+---------+------+---------------------+---------+---------+------+-------+-------------------+8 rows in set (0.00 sec)mysql>然后,你可以看到像上面这样的MySQL数据连接列表,而且每一个都会有一个进程ID号(在上表的第一列)。我们只要输入这样的命令:mysql>kill 1180421Query OK, 0 rows affected (0.00 sec)mysql>其中1180421为你在进程列表里找到并且要杀掉的进程号。产生这种问题的原因是:连接数超过了 MySQL 设置的值,与 max_connections 和 wait_timeout 都有关系。wait_timeout 的值越大,连接的空闲等待就越长,这样就会造成当前连接数越大。解决方法:修改MySQL
配置文件/etc/my.cnf,设置成max_connections=1000,wait_timeout=5。如果没有此项设置可以自行添加,修改后重启MySQL服务即可。要不经常性报此错误,则要对服务器作整体性能优化注:为了防止发生too many connections时候无法登录的问题,mysql manual有如下的说明:mysqld actually allows max_connections+1 clients to connect. The extra connection is reserved for use by accounts that have the SUPER privilege. By granting the SUPER privilege to administrators and not to normal users (who should not need it), an administrator can connect to the server and use SHOW PROCESSLIST to diagnose problems even if the maximum number of unprivileged clients are connected.因此, 必须只赋予root用户的SUPER权限,同时所有数据库连接的帐户不能赋予SUPER权限。前面说到的
报错后无法登录就是由于我们的应用程序直接配置的root用户 总结,解决问题的最终方法:1.修改配置文件/etc/my.cnf,调整连接参数2.检查程序代码,对于没有关闭的链接及时进行关闭
最近做的一个JavaWeb项目,持久层用SpringJDBC+DBCP+MySQL。一开始只配置了DBCP的一些常用参数,没有注意对空闲连接的检查和回收。项目部署在tomcat后,刚开始使用没用问题。第二天再试图登录时,发生了报错:
可以看到,报错信息提示上次交互已经是82664635ms前,超过了MySQL server配置的'wait_timeout'(默认是8小时),所以该连接已经被MySQL回收了,但DBCP不知道连接已被回收,依然试图执行 *** 作,引发了异常。报错信息提示可以修改wait_timeout或者添加autoReconnect=true。
(备注:mysql5以上的,设置autoReconnect=true 是无效的 只有4.x版本,起作用)
这两个参数的默认值是8小时(60 60 8=28800)。 注意:wait_timeout的最大值只允许2147483 (24天左右)
也可以用MySQL命令进行修改
这种办法治标不治本。
2.减少连接池内连接的生存周期,使之小于上一项中所设置的wait_timeout 的值。
也就是说,让已经断开的空闲连接没有机会被使用,提前被回收。
以C3P0配置为例:
DBCP中配置minEvictableIdleTimeMillis即可。
3.配置连接池
定期使用连接池内的连接,使得它们不会因为闲置超时而被 MySQL 断开。并且每次使用连接前检查连接是否可用,定期回收空闲的连接。
修改 c3p0 的配置文件,在 Spring 的配置文件中设置:
DBCP连接池的配置:
DBCP官方配置文档: http://commons.apache.org/proper/commons-dbcp/configuration.html
C3P0的配置标准:
关于MySQL的wait_timeout连接超时问题报错解决方案
评论列表(0条)