带有mysql的NodeJS服务器挂起

时间:2014-03-24 06:23:05

标签: mysql node.js exception-handling

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

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

从另一个堆栈问题我开始知道我必须处理这样的未被捕获的异常。

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

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

3 个答案:

答案 0 :(得分:2)

我不确定您是否正在为项目使用node-mysql模块,但我当时遇到了同样的ECONNRESET问题。这是我的回答的重复on my issue

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

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:0)

在运行查询后需要手动关闭连接的同时运行多个查询时发生错误。我制作了一个小脚本来处理这个问题。 https://gist.github.com/mkhizeryounas/647aebf07f37aabd5cddce66c45dcb25

var mysql = require("mysql");
var keys = require('./keys');

var pool = mysql.createPool({
    host     :  keys.mysql.host,
    port     :  keys.mysql.port,
    user     :  keys.mysql.user,
    password :  keys.mysql.password,
    database :  keys.mysql.database,
});

module.exports = {
  getConnection (callback) {
    pool.getConnection((err, conn) => {
      if(err) {
        return callback(err);
      }
      callback(err, conn);
    });
  },
  query (query, params=[], cb) {
    this.getConnection((err, conn) => {
        conn.release();
        if(err) return cb(err, null);
        conn.query(query, params, (err, res) => {
            if(err) return cb(err, null);
            return cb(null, res);
        });
    });
  }
}