4

我正在使用 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 次,而且都是在很短的时间内。这只能意味着在我的应用程序的某个地方,在短时间内建立了很多连接,对吧?

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

4

2 回答 2

2

MySQL 有一个默认的 MAX_CONNECTIONS = '100' 而不是 151,除非你改变它。此外,实际上您有 MAX_CONNECTIONS + 1。加 1 允许 root 用户即使在您已最大化连接后也可以登录,以便找出实际使用的内容。当您的连接被最大化时,请尝试以 root 身份登录并从 MySQL 运行以下命令。

mysql> SHOW FULL PROCESSLIST

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

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

于 2013-05-13T20:36:22.733 回答
0

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

于 2015-08-28T10:13:21.010 回答