在导出池的情况下,NodeJS与Mysql失去了连接

时间:2017-06-08 14:38:44

标签: mysql node.js azure pool

我有一个托管在远程服务器中的Mysql数据库和一个托管在Azure webapps中的Node API。

问题是mysql驱动程序丢失了连接,如果没有重启,则无法恢复连接。

我已经在server.js中声明了一个需要que pool的全局值:

global.DB = require('./middlewares/database');

在database.js:

    var pool = mysql.createPool({
    connectionLimit: 10,
    host: [SERVER],
    user: [USER],
    password: [PASSWORD],
    database: [DATABASE],
    connectTimeout: 20000,
    adquireTimeout: 20000,
    debug: false
});

exports.query = function (query, params, callback) {

    pool.getConnection(function (err, connection) {

        if (err) {
            console.log(err);
            connection.release();
            throw err;
        }

        connection.query(query, params, function (err, rows) {

            connection.release();

            if (!err) {
                callback(null, rows);
            }

        });
        connection.on('error', function (err) {
            connection.release();
            throw err;
        });
    });

然后,从API的任何位置进行任何查询:

 DB.query(queryString, [arguments], function (err, rows, fields) {
  if (err) throw err;
});

第一次正常工作但几分钟后才能正常工作:

    { Error: connect ETIMEDOUT
    at PoolConnection.Connection._handleConnectTimeout (D:\home\site\wwwroot\node_modules\mysql\lib\Connection.js:419:13)
    at Object.onceWrapper (events.js:293:19)
    at emitNone (events.js:86:13)
    at Socket.emit (events.js:188:7)
    at Socket._onTimeout (net.js:352:8)
    at ontimeout (timers.js:386:14)
    at tryOnTimeout (timers.js:250:5)
    at Timer.listOnTimeout (timers.js:214:5)
    --------------------
    at Protocol._enqueue (D:\home\site\wwwroot\node_modules\mysql\lib\protocol\Protocol.js:141:48)
    at Protocol.handshake (D:\home\site\wwwroot\node_modules\mysql\lib\protocol\Protocol.js:52:41)
    at PoolConnection.connect (D:\home\site\wwwroot\node_modules\mysql\lib\Connection.js:130:18)
    at Pool.getConnection (D:\home\site\wwwroot\node_modules\mysql\lib\Pool.js:48:16)
    at Pool.releaseConnection (D:\home\site\wwwroot\node_modules\mysql\lib\Pool.js:157:10)
    at Pool._removeConnection (D:\home\site\wwwroot\node_modules\mysql\lib\Pool.js:277:8)
    at Pool._purgeConnection (D:\home\site\wwwroot\node_modules\mysql\lib\Pool.js:258:8)
    at Ping.onOperationComplete [as _callback] (D:\home\site\wwwroot\node_modules\mysql\lib\Pool.js:101:12)
    at Ping.Sequence.end (D:\home\site\wwwroot\node_modules\mysql\lib\protocol\sequences\Sequence.js:86:24)
    at D:\home\site\wwwroot\node_modules\mysql\lib\protocol\Protocol.js:399:18
  errorno: 'ETIMEDOUT',
  code: 'ETIMEDOUT',
  syscall: 'connect',
  fatal: true }

我将Mysql的超时调整为28800,并将错误连接设置为1000而没有结果。

如何在不丢失连接的情况下进行类似模式的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

有两种方法可以解决这个问题,让你当前的模式“整洁干净”。

1。重新创建游泳池

发生错误后,您可以在'uncaughtException'或一些其他处理机制中捕获它,它将为您重新创建池。

process.on('uncaughtException', function (err) {
...
// MySql Handle
if ('code' in err) {
    if(err.code === 'ECONNREFUSED'){
        db.methodToRecreatePool();
    }
}
...

2。重启服务

其他方法是在永远cli中启动节点进程,为您管理节点快速服务器,一旦显示此错误,您可以重新启动节点服务器,永远cli将再次为您启动它。

process.on('uncaughtException', function (err) {
    console.log(err);
    process.exit(1);
});

永远启动节点服务器:

forever start app.js

希望它有所帮助,让我了解它的进展情况;

祝你好运,