Node.js和MySQL“Too many connections”错误

时间:2013-05-13 19:34:05

标签: mysql node.js error-handling

我正在使用Node.js为我的Web应用程序运行Web服务器。我还使用node-mysql模块与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次,并且都在很短的时间内完成。这可能只意味着在我的应用程序的某个地方很多连接在短时间内建立,对吗?

我怎么能避免这个问题?这非常令人沮丧。所有帮助都非常感谢。感谢

2 个答案:

答案 0 :(得分:2)

MySQL默认MAX_CONNECTIONS ='100'不是151,除非您更改它。另外,实际上你有MAX_CONNECTIONS + 1.加号1允许root用户登录,即使你已经最大化了连接以便弄清楚实际使用的是什么。当您的连接最大化时,请尝试以root用户身份登录并从MySQL运行以下命令。

mysql> SHOW FULL PROCESSLIST

发布上述命令的输出。一旦你真正知道什么在消耗你的资源,你可以去修复它。很容易就是你的代码留下了开放的连接。

您应该查看以下文档:Show Processlist

答案 1 :(得分:0)

+1的问题。调查显示node-mysql打开连接并且不关闭它们。因此,在某一时刻达到最大连接的极限。问题是为什么node-mysql没有关闭连接?