mysql释放连接问题
发布于 8 年前 作者 im-here 5886 次浏览 来自 问答

最近用mysql做项目,用了连接池,发现一个问题:

pool.getConn(function(error,conn){
 conn.release();//A
  conn.query(sql,function(error,val){
   conn.release();//B
   //.....
  });
})

官方给的代码释放连接应该是在B位置,但是我无意中发现在A位置释放了连接,后面居然还能正常查询,而且连接确实也释放了,一切正常。按道理我在A位置释放了连接,下面的query应该报错才对呀。

12 回复

为什么会报错? release 并不是关闭边接,只是跟池声明我已经用完了,你可以把这个连接给别人用了。那么别人来请求连接的时候池就可能把这个连接给别人使用。 你继续用也可以,但就不安全了!

@klesh 原来如此,多谢!

直接 pool.query 进行查询就好了,会自动释放的。

@alsotang 还可以这样? 我用的mysql模块。

@alsotang 那是要闲置的连接超时了才会被close,楼主的场景时间极短,不会被close的。

来自酷炫的 CNodeMD

你们连接池一般设置多少个连接?等待队列又是多少? 最近发现cluster模式下,开10个进程,每个进程10个数据库连接,还是会卡,访问量很小,重启服务后恢复正常,感觉连接没释放?

@klesh 释放跟 close 两回事吧。释放指的是会自动回到资源池,但不一定跟server断开连接

@zstxt1989 访问量小的话,只要释放了应该不会卡吧。 多半是连接没释放,这种情况 最好只开一个进程,连接数设为1测试下就知道了。

@alsotang 噢,对

来自酷炫的 CNodeMD

@alsotang 请教下,如果用pool.query的话,能保证每个conn都是独立的吗? 就好比如执行事务的时候要求同一个事务里的连接必须是独立的。

@imhered 不能。事务的时候,需要手动取出 connection

@alsotang 好的,谢谢!

回到顶部