跳到主要内容
CNode

mysql释放连接问题

问答
Iim-here发布于 10 年前最后回复 10 年前
1273210

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

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

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

查看回复

回复 (12)

I
im-here#1010 年前
引用 alsotang@klesh 释放跟 close 两回事吧。释放指的是会自动回到资源池,但不一定跟server断开连接

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

K
klesh#910 年前

@alsotang 噢,对

来自酷炫的 CNodeMD

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

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

A
alsotang#710 年前
引用 klesh@alsotang 那是要闲置的连接超时了才会被close,楼主的场景时间极短,不会被close的。 来自酷炫的 CNodeMD

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

Z
zstxt1989#610 年前

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

K
klesh#510 年前

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

来自酷炫的 CNodeMD

I
im-here#410 年前
引用 alsotang直接 pool.query 进行查询就好了,会自动释放的。

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

A
alsotang#310 年前

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

K
klesh#110 年前

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

参与回复

登录后即可参与回复。登录