有什么从数据库层面解决数据库连接数过多的解决方案吗?

30 views
Skip to first unread message

蓝白

unread,
Jul 25, 2011, 7:30:37 AM7/25/11
to MySQLer
开发人员有时候写代码访问数据库的时候,
打开数据库,然后访问数据,操作完毕后,最后忘记关闭了数据库

结果随着操作的越来越多,连接一直增长,没有关闭,最后导致数据库瘫掉

不知有没有办法 让mysql数据库自己关掉一段时间没有响应的数据库连接,

或者从数据库中获知是哪些线程执行过的sql语句,这样我可以大致判断出是开发人员的哪部分的程序没有关闭连接

Xupeng Yun

unread,
Jul 25, 2011, 8:53:20 AM7/25/11
to mys...@googlegroups.com


2011/7/25 蓝白 <lanb...@126.com>

开发人员有时候写代码访问数据库的时候,
打开数据库,然后访问数据,操作完毕后,最后忘记关闭了数据库

结果随着操作的越来越多,连接一直增长,没有关闭,最后导致数据库瘫掉

不知有没有办法 让mysql数据库自己关掉一段时间没有响应的数据库连接,

MySQL会关掉闲置的连接,只不过默认的超时时间比较长(wait_timeout 默认是28800秒),可以根据实际情况调低。
 

或者从数据库中获知是哪些线程执行过的sql语句,这样我可以大致判断出是开发人员的哪部分的程序没有关闭连接

可以通过show processlist或者在INFORMATION_SCHEMA.PROCESSLIST中找出闲置时间较长的连接的发起者,如:192.168.1.21:53220,有了这些信息之后,就可以到192.168.1.21这台主机上,lsof -i TCP:53220,找到发起这个数据库连接的进程,不过这个粒度还太粗。

要知道是哪部分代码发起了连接并闲置,可能需要从客户端的数据库访问lib入手,比如在我的应用场景下(Python /  自有的MySQLdb客户端封装),我可以记录感兴趣的query,以及自query发起处开始的若干级call stack,这样就可以很容易知道究竟是那段代码(具体到文件、行)发起的何种查询。其他语言和应用场景用类似的思路应该也不难找到变通的方法达到类似的目的。

hior

unread,
Jul 25, 2011, 1:05:18 PM7/25/11
to mys...@googlegroups.com
服务器设置较小的wait_timeout如2s;程序如果有需要,设置会话级的wait_timeout覆盖全局值
Reply all
Reply to author
Forward
0 new messages