【问题标题】:Node.js and MySQL "Too many connections" errorNode.js 和 MySQL “连接太多”错误
【发布时间】:2013-05-07 22:36:03
【问题描述】:

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

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

【问题讨论】:

  • 在没有实际代码的情况下很难分辨。但是看看connection pooling 看看它是否有帮助。
  • 我会尝试实现它,看看它是否有帮助。如果没有,我怎么能回到这个帖子?我想解决这个问题,我希望这篇文章成为解决这个问题的中心。
  • 至少显示关于如何使用 mysql 模块进行查询的代码(和一些上下文)。不必是完整的应用程序或任何东西,只是为了让其他人了解您如何使用它。另外,你能发布你正在使用的模块吗?因为它看起来不像您使用的是this one(编辑:啊等等,您使用的是它的旧版本。尝试将其更新到更新的版本)。
  • 您可能在实际关闭查询之前打开了太多查询。
  • 你解决过这个问题吗?我发生了完全相同的事情,我似乎无法弄清楚为什么。我猜要开始尝试添加连接池了。

标签: mysql node.js error-handling


【解决方案1】:

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

mysql> SHOW FULL PROCESSLIST

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

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

【讨论】:

  • 我可以看到 4 个睡眠连接连接到我的应用程序的数据库。那么,这是否意味着我的应用程序有泄漏?它必须是这个意思,因为为什么连接会处于休眠状态?完成运行查询后,我会立即关闭连接。挑战依然存在;我如何知道应用程序在我的代码中泄漏的位置?
  • 发布 SHOW PROCESSLIST 的输出。什么用户用于建立您的连接?实际列出的进程是否来自运行此应用程序
【解决方案2】:

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

【讨论】:

  • 找到原因 - 您必须自己关闭打开的连接。并且使用打开的连接而不是创建新连接。
猜你喜欢
  • 2010-11-15
  • 2017-10-29
  • 2015-03-24
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多