为了提高数据库的IO速度,会使用连接池做处理,但是在高并发的情况下,一条连接完成任务后不释放掉, 会导致链接池满负载 ,后面的请求将无法处理,程序就会出现阻塞。
因此,当一条连接完成它的任务后,我们必须将它释放掉。(基本代码如下:)
var mysql = require('mysql');
var pool = mysql.createPool({
host:'127.0.0.1',
port:3306,
protocol:'mysql',
user:'root',
password:'123456',
database:'test_db',
connectionLimit:100 //最大连接数
})
pool.getConnection(function(err,conn){
if(err){
//do something
}
conn.query(sql,args,function(err,data){
if(err){
//do something
}else{
//return data or anything you want do!
}
conn.release(); //释放连接
})
})
但是,程序还是会出现阻塞,于是又是各种查阅资源文档。代码并没有任何错误。
为了进一步测试,修改了connectionLimit的数值大小,改成200,继续操作程序,没有阻塞。可以确定是连接还占用着资源
查看服务器MySQL当前连接
发现有一百多个处于sleep状态的连接
当连接处于sleep状态时会一直占用资源。
mysql手册中给出以下解释:
1.客户端程序在退出之前没有关闭连接.[写程序的疏忽,或者数据库的db类库没有自动关闭每次的连接(例如没有release(),当然,这里我们已经使用了release())]
2.客户端sleep的时间在wait_timeout或interactive_timeout规定的秒内没有发出任何请求到服务器. [类似长连,类似于不完整的tcp ip协议构造,服务端一直认为客户端仍然存在(有可能客户端已经断掉了)]
3.客户端程序在结束之前向服务器发送了请求还没得到返回结果就结束掉了
解决方法以下两种:
1、修改mysql配置文件,在[mysqld]下填加以下代码
wait_timeout=10
修改完成后重启服务,但是重启服务往往不是件好事。因此有了第二种方法
2、通过mysql命令修改
set global wait_timeout = 10;
/**wait_timeout默认为28800,试想一下,占用这么长时间能不出事吗!**/
修改完成后再次操作程序,问题已解决
新猿一枚 ,若读者发现文中有误之处,还请提出。感谢!