我正在运行通过node- mysql模块连接到MySQL的Node服务器。连接和查询MySQL最初运行良好,没有任何错误,但是,将Node服务器闲置几个小时后的第一个查询会导致错误。错误是熟悉的read ECONNRESET,来自node-mysql模块的内部。
read ECONNRESET
堆栈跟踪(请注意,跟踪的三个条目属于我的应用程序的错误报告代码):
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)
我的云节点服务器和MySQL服务器以及两者的本地设置都发生此错误。
我的问题:
这个问题似乎是由于Node到MySQL服务器的连接断开,可能是由于连接寿命限制所致?
使用连接池时,node-mysql应该可以很好地处理断开连接并从连接池中删除它们。在进行查询之前是否不知道断开连接,从而使错误不可避免?
考虑到我在其他StackOverflow帖子中经常看到“读取ECONNRESET”错误,我是否应该在MySQL的其他地方查找问题以进行诊断?
更新: 更多的浏览之后,我觉得我的问题是重复的这一个。看来他的连接也在断开连接,但是没有人建议如何保持连接活动或如何解决第一个查询失败后的错误。
我在他们的Github页面上联系了node- mysql的人们,并得到了一些肯定的答案。
MySQL确实会修剪空闲连接。有一个MySQL变量“ wait_timeout”,用于设置超时前的秒数,默认值为8小时。我们可以将默认值设置为更大。使用show variables like 'wait_timeout';查看您的超时设置和set wait_timeout=28800;改变它。
show variables like 'wait_timeout';
set wait_timeout=28800;
根据这个问题,node-mysql在这些断开连接后不会修剪池连接。模块开发人员建议使用心跳来使连接保持活动状态,例如按SELECT 1;间隔调用。他们还建议使用节点池模块及其idleTimeoutMillis选项来自动修剪空闲连接。
SELECT 1;