[英]How to keep mysql connections alive in node.js?
我在 Node JS 中使用 mysql 连接池。 一段时间后,连接过期,下次我执行查询时,需要创建一个新连接。 这可能会导致几秒钟的延迟。 不能接受!
我想实现 keepalive 功能以定期轮询数据库并确保与后端的连接始终健康。 我正在寻找尝试过相同方法的其他人的意见,或对我的方法的反馈。
const mysql = require('mysql');
const pool = createConnectionPool();
setInterval(keepalive, 180000); // 30 mins
function keepalive() {
pool._freeConnections.forEach((connection) => pool.acquireConnection(connection,function () {
connection.query('SELECT 1 + 1 AS solution', function (err) {
if (err) {
console.log(err.code); // 'ER_BAD_DB_ERROR'
}
console.log('Keepalive RDS connection pool using connection id', connection.threadId);
})
}));
}
这个keepalive已经有些成功了:
- 一旦连接打开,它就会保持打开状态
- 连接永远不会超时
- 如果连接丢失,将在下一个时间间隔重新创建
这种保活并不理想:
- mysql 连接池是惰性的,只在需要时创建和恢复连接。 有了这个 keepalive,池就不再懒惰了。 一旦连接打开,keepalive 将保持打开状态。 该池不再根据流量进行扩展。
- 我不确定我的遍历免费连接列表并执行查询的方法是否明智。 当 keepalive 使用相同的连接时,应用程序是否可以从池中检出相同的连接?
另一种可能的方法是放弃应用程序中的保持活动功能,并依靠心跳流量来保持最少的连接活动。
有没有人尝试实现保活功能,使用 package 或提供此功能的工具,或者最终使用不同的方法?
如果使用池连接,你试过这个吗
const pool = mysql.createPool({...});
function keepAlive() {
pool.getConnection(function(err, connection){
if(err) { console.error('mysql keepAlive err', err); return; }
console.log('ping db')
connection.ping(); // this is what you want
connection.release();
});
}
setInterval(keepAlive, 60000); // ping to DB every minute
我不使用池,此代码有效
function pingdb() {
var sql_keep = `SELECT 1 + 1 AS solution`;
con.query(sql_keep, function (err, result) {
if (err) throw err;
console.log("Ping DB");
});
}
setInterval(pingdb, 40000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.