我有一个托管在远程服务器中的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而没有结果。
如何在不丢失连接的情况下进行类似模式的最佳方法是什么?
答案 0 :(得分:0)
有两种方法可以解决这个问题,让你当前的模式“整洁干净”。
发生错误后,您可以在'uncaughtException'或一些其他处理机制中捕获它,它将为您重新创建池。
process.on('uncaughtException', function (err) {
...
// MySql Handle
if ('code' in err) {
if(err.code === 'ECONNREFUSED'){
db.methodToRecreatePool();
}
}
...
其他方法是在永远cli中启动节点进程,为您管理节点快速服务器,一旦显示此错误,您可以重新启动节点服务器,永远cli将再次为您启动它。
process.on('uncaughtException', function (err) {
console.log(err);
process.exit(1);
});
永远启动节点服务器:
forever start app.js
希望它有所帮助,让我了解它的进展情况;
祝你好运,