MySQL在node.js服务器上空闲时间后出现"读取ECONNRESET"错误

Bre*_*aut 11 mysql connection node.js node-mysql econnreset

我正在运行一个通过node-mysql模块连接MySQL的Node服务器.连接和查询MySQL最初运行良好,没有任何错误,但是,在节点服务器空闲几小时后的第一个查询会导致错误.错误是熟悉的read ECONNRESET,来自node-mysql模块的深度.

堆栈跟踪(请注意,跟踪的三个条目属于我的应用程序的错误报告代码):

Error
at exports.Error.utils.createClass.init (D:\home\site\wwwroot\errors.js:180:16)
at new newclass (D:\home\site\wwwroot\utils.js:68:14)
at Query._callback (D:\home\site\wwwroot\db.js:281:21)
at Query.Sequence.end (D:\home\site\wwwroot\node_modules\mysql\lib\protocol\sequences\Sequence.js:78:24)
at Protocol.handleNetworkError (D:\home\site\wwwroot\node_modules\mysql\lib\protocol\Protocol.js:271:14)
at PoolConnection.Connection._handleNetworkError (D:\home\site\wwwroot\node_modules\mysql\lib\Connection.js:269:18)
at Socket.EventEmitter.emit (events.js:95:17)
at net.js:441:14
at process._tickCallback (node.js:415:13)
Run Code Online (Sandbox Code Playgroud)

我的云节点服务器和MySQL服务器以及两者的本地设置都会发生此错误.

我的问题:

  1. 这个问题是否是由于连接生命周期限制导致Node与MySQL服务器的连接断开?

  2. 使用连接池时,node-mysql应该优雅地处理断开连接并从池中删除它们.在我进行查询之前是否不知道断开连接,从而使错误不可避免?

  3. 考虑到我在其他StackOverflow帖子中看到了很多"读取ECONNRESET"错误,我应该从MySQL寻找其他地方来诊断问题吗?

更新:经过更多浏览后,我认为我的问题与问题重复.看起来他的连接也在断开连接,但没有人建议如何保持连接活动或如何解决第一次查询失败之外的错误.

Bre*_*aut 11

我在他们的Github页面上找到了node-mysql的人,得到了一些坚定的答案.

  1. MySQL确实修剪了空闲连接.有一个MySQL变量"wait_timeout",用于设置超时前的秒数,默认为8小时.我们可以将默认值设置为远大于此值.使用show variables like 'wait_timeout';查看您的超时设置和set wait_timeout=28800;改变它.

  2. 根据此问题,node-mysql在这些断开连接后不会修剪池连接.模块开发人员建议使用心跳来保持连接活动,例如调用SELECT 1;间隔.他们还建议使用node-pool模块及其idleTimeoutMillis选项自动修剪空闲连接.


Ben*_*ker 8

如果在建立单个重用连接时发生这种情况,可以通过建立连接池来避免。

例如,如果你正在做这样的事情......

var db = require('mysql')
  .createConnection({...})
  .connect(function(err){});
Run Code Online (Sandbox Code Playgroud)

这样做...

var db = require('mysql')
  .createPool({...});
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的洞察力。我最近在遇到同样的错误时发现了这篇文章。切换到使用连接池为我解决了这个问题,所以我发布了这个以帮助处于相同情况的其他人。 (2认同)