Mysql “给予”;阅读Econreset“;node.js服务器空闲时间后出错

Mysql “给予”;阅读Econreset“;node.js服务器空闲时间后出错,mysql,node.js,connection,node-mysql,econnreset,Mysql,Node.js,Connection,Node Mysql,Econnreset,我正在运行一个通过Node-MySQL模块连接到MySQL的节点服务器。连接到MySQL并查询MySQL最初运行得很好,没有任何错误,但是,让节点服务器空闲几个小时后的第一次查询会导致错误。错误是常见的read ECONNRESET,来自节点mysql模块的深处 堆栈跟踪(请注意,跟踪的三个条目属于我的应用程序的错误报告代码): 此错误发生在我的云节点服务器和MySQL服务器上,以及两者的本地设置上 我的问题是: 这个问题是否可能是由于连接生命周期的限制,导致节点与MySQL服务器的连接断开 当

我正在运行一个通过Node-MySQL模块连接到MySQL的节点服务器。连接到MySQL并查询MySQL最初运行得很好,没有任何错误,但是,让节点服务器空闲几个小时后的第一次查询会导致错误。错误是常见的
read ECONNRESET
,来自节点mysql模块的深处

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

此错误发生在我的云节点服务器和MySQL服务器上,以及两者的本地设置上

我的问题是:

  • 这个问题是否可能是由于连接生命周期的限制,导致节点与MySQL服务器的连接断开

  • 当使用连接池时,节点mysql应该优雅地处理断开连接并从池中删除它们。在我进行查询之前,它是否没有意识到断开连接,从而使错误不可避免

  • 考虑到我在其他StackOverflow文章中经常看到“read EconReset”错误,我是否应该从MySQL的其他地方寻找问题的答案

  • 更新:经过更多的浏览,我认为我的问题是重复的。他的连接似乎也在断开连接,但除了第一次查询失败之外,没有人建议如何保持连接的活动性或如何解决错误

    这个问题是否可能是由于连接生命周期的限制,导致节点与MySQL服务器的连接断开

    对。服务器已关闭其连接端

    当使用连接池时,节点mysql应该优雅地处理断开连接并从池中删除它们。在我进行查询之前,它是否没有意识到断开连接,从而使错误不可避免

    正确,但它应该在内部处理错误,而不是将错误传递给您。这似乎是节点mysql中的一个错误。报告它

    考虑到我在其他StackOverflow文章中经常看到“read EconReset”错误,我是否应该从MySQL的其他地方寻找问题的答案


    这要么是节点MySQL连接池实现中的一个bug,要么是您没有正确配置它以检测故障

    我联系了mysql的同事,得到了一些明确的答案

  • MySQL确实会删除空闲连接。有一个MySQL变量“wait_timeout”设置超时前的秒数,默认值为8小时。我们可以将默认值设置为远大于此值。使用
    显示变量,如“wait_timeout”
    查看您的超时设置,并
    设置wait\u timeout=28800以更改它

  • 根据,节点mysql不会在这些断开连接之后修剪池连接。模块开发人员建议使用心跳来保持连接处于活动状态,例如调用
    SELECT 1在一个时间间隔内。他们还建议使用及其idleTimeoutMillis选项自动修剪空闲连接


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

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

    var db = require('mysql')
      .createConnection({...})
      .connect(function(err){});
    
    改为这样做

    var db = require('mysql')
      .createPool({...});
    

    谢谢我已经报告了这个问题。我想你是对的,但我想从他们的开发者那里得到绝对的确认,这是一个bug,而不是我应用程序代码中的错误。我对node MySQL一无所知,但其他连接池允许您定义一个伪SQL语句,如“SELECT 1”,池可以使用该语句在将连接返回给您之前测试连接是否仍然处于活动状态。您需要调查您是否正确地执行了此操作,或者根本没有执行此操作。无论是使用单个连接还是池,我仍然遇到此问题。正如我接受的答案所概述的,这是MySQL挂断和节点MySQL没有意识到这一点的症状。从那时起,这可能已经被修复了,因为我已经使用它很多年了。谢谢你的洞察力。我最近遇到同样的错误时发现了这篇文章。切换到使用连接池对我来说解决了这个问题,所以我发布这个帖子是为了帮助其他处于同样情况的人。你的问题和答案确实帮助了我。您是否有试用节点池模块的经验?您可能有具体的例子吗?添加/etc/my.cnf wait_timeout=28800;这是有效的:-)
    var db = require('mysql')
      .createPool({...});