繁体   English   中英

如何在 node.js 中保持 mysql 连接存活?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM