Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NodeJS与已导出池的Mysql失去连接_Mysql_Node.js_Azure_Pool - Fatal编程技术网

NodeJS与已导出池的Mysql失去连接

NodeJS与已导出池的Mysql失去连接,mysql,node.js,azure,pool,Mysql,Node.js,Azure,Pool,我有一个托管在远程服务器上的Mysql数据库和一个托管在Azure webapps上的节点API 问题是mysql驱动程序失去了连接,如果没有重新启动,就无法恢复连接 我已在server.js上声明了一个全局值,该值需要que池: global.DB = require('./middlewares/database'); 在database.js上: var pool = mysql.createPool({ connectionLimit: 10, host: [S

我有一个托管在远程服务器上的Mysql数据库和一个托管在Azure webapps上的节点API

问题是mysql驱动程序失去了连接,如果没有重新启动,就无法恢复连接

我已在server.js上声明了一个全局值,该值需要que池:

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.重新创建池 错误发生后,您可以在“uncaughtException”或其他一些处理机制中捕获它,这些机制将为您重新创建池

process.on('uncaughtException', function (err) {
...
// MySql Handle
if ('code' in err) {
    if(err.code === 'ECONNREFUSED'){
        db.methodToRecreatePool();
    }
}
...
2.重新启动服务 另一种方法是在forever cli中启动节点进程,该进程将为您管理node express服务器,一旦显示此错误,您可以重新启动节点服务器,forever cli将再次为您启动它

process.on('uncaughtException', function (err) {
    console.log(err);
    process.exit(1);
});
要永远启动节点服务器,请执行以下操作:

forever start app.js
希望有帮助,告诉我进展如何


祝你好运,

通常,这是一个网络或防火墙问题。您提到“托管在Azure webapps中的节点API”,您是否在本地服务器上测试了上述代码,以检查远程服务器网络是否正常工作?或者您可以提供更多信息,例如您正在使用的Node.js版本和您正在使用的
mysql
模块版本,以便我们可以使用这些信息来重现问题?