为何使用mysql模块连接池,释放连接后,数据库还是很多sleep的连接
发布于 7 年前 作者 shuaishenk 8150 次浏览 来自 问答

为何使用mysql模块连接池,释放连接后,数据库还是很多sleep的连接 1.png 2.png

把release换成destroy后能解决这个问题,一个连接都没了,但是每次创建连接是需要消耗时间的,部署到华为的云服务器上,访问它内网的mysql,响应4s以上。。 所以请问大神们这个问题怎么解决啊

12 回复

这个是sleep是正常的,mysql默认好像是8个小时回收sleep的连接吧? 不过你这个连接数有点多啊,代码里连接池内连接数设置的多少?

@imhered 3.png 代码里设置的是10…

@shuaishenk 启动了多少个这个node服务? 如果代码没错的话,一个服务是10个连接,如果你只启动了一个服务的话,应该连接数是在10个左右。 但是你上面这个图连接有点多,是启动了多少个node服务?

@imhered 就启动了一个啊 1.png

@imhered 我发现每调一个新的接口,就会增加一个连接…release好像根本没起作用

@shuaishenk release 是放回连接池。你的连接池数量是10个, 如果release不起作用的话理论上你掉10次之后第11次会一直等待(也可以设置成直接抛出error)

如果你没有事物相关的要求连接必须唯一的操作的话,直接pool.query吧,自动释放的,这个是针对mysql这个包的,如果不是请忽略。

好的,多谢~

你如果看了pool.query的底层方法,你到时候又会一脸懵逼 哈哈哈哈

@shadow88sky 是啊,还是包了一层啊,release。。求指教

我觉得你数据库的截图和 conn.release没关系,因为我也是这么用的,没问题。
另外 pool里面有个事件,叫做enqueue。 你可以监听并且测试下,意思大概是 如果你设置了10个连接数,那么如果10个都没有释放,当第十一个请求过来的时候,就会被这个事件捕捉到。一直会等待到有其中一个连接释放后,你的第11个连接的sql才会执行。
建议你是不是看看是否是别的原因引起的。

@shadow88sky 非常感谢,解决了,是自己代码的问题,require了多个自己封装的mysql操作。。

回到顶部