带有 mysql 的 NodeJS 服务器挂起

Posted

技术标签:

【中文标题】带有 mysql 的 NodeJS 服务器挂起【英文标题】:NodeJS Server with mysql hangs 【发布时间】:2014-05-01 09:27:34 【问题描述】:

我正在使用 NodeJS、Express、mysql 编写一个应用程序,到目前为止一切正常,但是当我在 mysql 连接中断后运行我的应用程序时,我的应用程序通过这个异常并且我的应用程序出现故障。

Error: read ECONNRESET
    at errnoException (net.js:901:11)
    at TCP.onread (net.js:556:19)

从另一个 stackquestion 中,我知道我必须像这样处理此类未捕获的异常。

process.on('uncaughtException', function(err) 
    console.log('Caught exception: ' + err);
    console.log(err.stack);
);

在此之后,现在我的应用程序没有退出,而是挂起,所以我的问题是如何处理此异常,以便即使在此异常之后mysql连接正常并且我的应用程序没有挂起。

【问题讨论】:

看看这个node-js-econnreset 是的,我从你提到的问题中得到了这个process.on(...),它只捕获了异常,但我的应用程序仍然挂起,可能是因为我失去了与 mysql 的连接,我只是捕捉到这个异常,我想要重新建立与mysql的连接,我只是不知道该怎么做 我尝试使用 mysql 重新连接,这给出了关于排队连接的错误,然后我在重新连接之前尝试了 connection.destroy,但仍然给出了排队错误。 我想一旦你的 mysql 连接断开,你需要在一段时间后尝试重新连接。在此期间,您应该确保您的应用程序不会尝试使用 mysql 查询。我认为闲逛是因为一些使用mysql的代码。 然后想象一下,如果您发送大量查询并且没有任何东西可以处理它们会发生什么。可能您每次都会抛出一个新异常。我建议在您的代码和 mysql 适配器之间添加一个层。只是一个代理,如果连接丢失以某种方式延迟请求,直到您的连接恢复。 【参考方案1】:

我不确定您是否为您的项目使用了 node-mysql 模块,但我曾经使用过,并且遇到了相同的 ECONNRESET 问题。这是我的答案on my issue的重复:

我在their Github page 上联系了node-mysql 人员并得到了一些确定的答案。

    MySQL 确实会修剪空闲连接。有一个 MySQL 变量“wait_timeout”设置超时前的秒数,默认值为 8 小时。我们可以将默认值设置为远大于此。使用show variables like 'wait_timeout'; 查看您的超时设置并使用set wait_timeout=28800; 进行更改。

    根据this issue,node-mysql 在此类断开连接后不会修剪池连接。模块开发人员建议使用心跳来保持连接,例如每隔一段时间调用SELECT 1;。他们还建议使用 node-pool module 及其 idleTimeoutMillis 选项来自动修剪空闲连接。

【讨论】:

谢谢,但我解决了这个问题,这是一件棘手的事情需要时间,但我找到了解决方法 你用同样的方法解决了吗?我很想听听您的解决方案。 感谢 So 社区,首先我捕获了所有未捕获的异常,这使得我的应用程序没有异常退出,其次我遇到的挂起问题是因为当服务器关闭连接时,我请求的所有查询都会失败,我的服务器会简单地挂断我猜它的 node-mysql 错误,但我使用连接池解决了它,如果服务器关闭连接,它会在大约一秒钟后重新获取,所以我的问题通过这种方式解决了。我仍然认为节点架构在某种程度上还不够成熟,但让我们看看接下来会发生什么。 @krasimir 评论可能有助于解决连接断开时服务器挂起的原因。【参考方案2】:

我找到了解决方案,如果其他人遇到同样的问题,我会发布,这也可能对你们有所帮助。

首先我捕获了所有未捕获的异常,这使得我的应用程序不会异常退出。

我遇到的第二个挂起问题是因为当服务器关闭连接时,我请求的所有查询都会失败,我的服务器会简单地挂起我猜它的 node-mysql 错误,但我使用连接池解决了它,在池中如果服务器关闭连接,它会在大约一秒钟后重新获得,所以我的问题就这样解决了。

Here is how to make most out of node-mysql pooling

【讨论】:

以上是关于带有 mysql 的 NodeJS 服务器挂起的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 NodeJS 创建与 MySQL 数据库的连接时 PHP Exec 挂起

Nodejs,Cloud Firestore上传任务 - 身份验证错误:错误:套接字挂起

Nodejs 和 Mysql 的成就 - 性能和可扩展性

MySQL 在负载测试后挂起。错误 2002 - 服务器没有响应(或本地 MySQL 服务器的套接字未正确配置)

NodeJS与带Mysql数据库的Laravel哪个性能更好?

带有 2 个 INNER JOIN 的 MYSQL 更新挂起