最近用mysql做项目,用了连接池,发现一个问题:
pool.getConn(function(error,conn){
conn.release();//A
conn.query(sql,function(error,val){
conn.release();//B
//.....
});
})
官方给的代码释放连接应该是在B位置,但是我无意中发现在A位置释放了连接,后面居然还能正常查询,而且连接确实也释放了,一切正常。按道理我在A位置释放了连接,下面的query应该报错才对呀。
为什么会报错? release 并不是关闭边接,只是跟池声明我已经用完了,你可以把这个连接给别人用了。那么别人来请求连接的时候池就可能把这个连接给别人使用。 你继续用也可以,但就不安全了!
@klesh 原来如此,多谢!
直接 pool.query
进行查询就好了,会自动释放的。
@alsotang 还可以这样? 我用的mysql模块。
你们连接池一般设置多少个连接?等待队列又是多少? 最近发现cluster模式下,开10个进程,每个进程10个数据库连接,还是会卡,访问量很小,重启服务后恢复正常,感觉连接没释放?
@klesh 释放跟 close 两回事吧。释放指的是会自动回到资源池,但不一定跟server断开连接
@zstxt1989 访问量小的话,只要释放了应该不会卡吧。 多半是连接没释放,这种情况 最好只开一个进程,连接数设为1测试下就知道了。
@alsotang 请教下,如果用pool.query
的话,能保证每个conn都是独立的吗? 就好比如执行事务的时候要求同一个事务里的连接必须是独立的。
@imhered 不能。事务的时候,需要手动取出 connection
@alsotang 好的,谢谢!