express + mysql,通过pool.getConnection连续查询数据库几次后出现数据库无响应
发布于 7 年前 作者 305211980 3480 次浏览 来自 问答

新手入门node,做了个小项目,采用了express + mysql,在本地开发时没什么问题,但是放在服务器后,测试时发现页面多访问几次后出现无响应,后台看到接收到了请求,只是在执行数据库操作的时候一直没有回调,重启项目后,有时候之前没执行的查询会再次执行,页面多访问几次后又出现同样问题,这个问题纠结了好久也没想明白,求大神支个招!感谢不尽。以下是调用数据库代码部分:QQ截图20170603221627.pngQQ截图20170603221641.png 部分代码有重叠

8 回复

QQ截图20170604115435.png漏了一张

有没有人遇到这个问题了?

和我之前遇到的一个问题很像。MySQL中有一个名叫wait_timeout的变量,表示操作超时时间,当连接超过一定时间没有活动后,会自动关闭该连接。因为mysql连接断开,我没有做异常处理,导致错误的代码继续在运行,导致node没有结束进程,所以node进程这些都好着,就是连不上数据库,重启项目就又恢复正常。过那么久又会出现问题。 我的解决办法是代码做异常处理。然后使用pm2守护node进程,一出现问题pm2就自动重启,好像在也没出现过上诉问题了。 我和你不一样的是,我没有用连接池去连数据库,按说你用连接池可以处理断开自动重连啊。 你再看看哪里出现问题了。

代码有问题,明显是连接未释放导致的。 把释放连接的代码放在callback前面,你放在后面是不会执行的,因为代码走到callback那一行就返回了 还有在err里最后也释放一下连接。不然如果err数量达到你连接池的数量也会卡住的。

最后:如果你没用到事物等需要连接唯一的,可以直接用pool执行sql操作,pool会自动get和release连接的,不需要你手动去release,这样可以有效防止忘了release。

@alloyteamzy 用navicat监控服务器数据库发现确实是连接未释放导致的,用pool.query解决了

@imhered 用navicat监控服务器数据库发现确实是连接未释放导致的,我试了下把释放放在callback前面,错误平率降低了,但是每次操作数据库时,navicat监控的进程数量都会增多,当达到最大连接数量的时候直接就报了个release undefined!最后使用pool.query就正常了,非常郁闷。 非常感谢~~!

回到顶部