NodeJS与已导出池的Mysql失去连接
我有一个托管在远程服务器上的Mysql数据库和一个托管在Azure webapps上的节点API 问题是mysql驱动程序失去了连接,如果没有重新启动,就无法恢复连接 我已在server.js上声明了一个全局值,该值需要que池: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
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
模块版本,以便我们可以使用这些信息来重现问题?