2013-05-13 123 views
3

我正在使用Node.js为我的Web应用程序运行Web服务器。我还使用node-mysql模块与MySQL服务器进行连接,以满足我所有的持久数据库需求。Node.js和MySQL“太多连接”错误

每当我的Node.js应用程序中发生严重错误,导致应用程序崩溃时,我会收到一封电子邮件。所以,我一直收到这封电子邮件,上面写着“连接太多”的错误。下面是错误的一个例子:

Error: Too many connections 
    at Function.Client._packetToUserObject (/apps/x/node_modules/mysql/lib/client.js:394:11) 
    at Client._handlePacket (/apps/x/node_modules/mysql/lib/client.js:307:43) 
    at Parser.EventEmitter.emit (events.js:96:17) 
    at Parser.write.emitPacket (/apps/x/node_modules/mysql/lib/parser.js:71:14) 
    at Parser.write (/apps/x/node_modules/mysql/lib/parser.js:576:7) 
    at Socket.EventEmitter.emit (events.js:96:17) 
    at TCP.onread (net.js:396:14) 

正如你所看到的一切告诉我的是,该错误是从MySQL模块来了,但它并没有告诉我,在我的应用程序代码中的问题发生。

我的应用程序随时打开数据库连接,我需要运行一个或多个查询。在收集到所有查询和数据后,我立即关闭连接。所以,我不明白我能超过151 max_connections的限制。

除非在我的代码中有一个地方忘记调用db.end()来关闭连接,否则我不会看到我的应用程序如何泄漏。即使出现这样的错误,我也不会收到几十个人发送的这些电子邮件。昨天,我收到了近100封电子邮件,其错误大致相同。这怎么可能发生?如果我的应用程序随着时间流逝泄漏并分配了连接,一旦发生第一个错误,应用程序进程就会崩溃,所有连接都将丢失,从而阻止应用程序再次崩溃。由于我收到了大约100封电子邮件,这意味着应用程序在短时间内崩溃了100次,并且全部都在短时间内崩溃。这只能意味着在我的应用程序的某个地方有很多连接在短时间内建立,对吗?

我怎么能避免这个问题?这是非常令人沮丧的。所有的帮助是高度赞赏。谢谢

+0

有点难以分辨没有实际的代码。但看看[连接池](https://github.com/felixge/node-mysql#pooling-connections)来查看它是否有帮助。 – robertklep 2013-05-13 19:40:13

+0

我会尽力实施这个看看是否有帮助。如果没有,我该如何回到这个帖子?我想解决这个问题,我希望这篇文章成为解决这个问题的中心。 – Sam 2013-05-13 19:48:12

+1

至少显示你如何使用mysql模块进行查询的代码(和一些上下文)。不必是一个完整的应用程序或任何东西,只是为了让其他人了解您如何使用它。另外,你可以发布你正在使用哪个模块吗?因为它看起来不像你使用[这个](https://github.com/felixge/node-mysql/)(编辑:啊等待,你使用它的一个古老的版本。尝试更新它到一个更新的版本)。 – robertklep 2013-05-13 19:49:36

回答

2

MySQL有一个默认MAX_CONNECTIONS ='100'不是151,除非你改变它。此外,事实上,您有MAX_CONNECTIONS + 1.加1允许root用户登录,即使您已经超出了限制,以便找出实际使用的内容。当连接超时时,尝试以root身份登录并从MySQL运行以下命令。

mysql> SHOW FULL PROCESSLIST 

将此命令的输出放在上面。一旦你真正知道什么是消耗你的资源,你可以去修复它。它可能很容易成为你的代码,离开开放连接。

你应该看看follwoing文档:Show Processlist

+0

我可以看到4个连接到我应用程序数据库的睡眠连接。那么,这将意味着我的应用程序有泄漏?这将意味着这是因为为什么连接会睡觉?我在完成运行查询后立即关闭连接。挑战依然存在;我如何知道应用程序在哪里泄漏? – Sam 2013-05-13 20:47:39

+0

发布SHOW PROCESSLIST输出。用户使用什么来建立连接?是否列出的进程实际上是运行此应用程序 – apesa 2013-05-13 21:25:23

0

+1的问题。调查显示我们node-mysql打开连接并且不关闭它们。因为那一刻就达到了最大连接的极限。问题是为什么node-mysql不关闭连接?

+0

找到原因 - 您必须自己关闭打开的连接。并使用打开的连接而不是创建新的连接。 – Volodymyr 2015-08-31 13:30:45