javascript 如何在node.js中保持mysql连接的活动状态?

lo8azlld  于 2023-02-02  发布在  Java
关注(0)|答案(2)|浏览(165)

我在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?
    另一种可能的方法是放弃应用程序中的keepalive功能,而依靠心跳流量来保持最少的连接处于活动状态。
    是否有人尝试过实现keepalive功能、使用提供此特性的软件包或工具,或者最终使用了不同的方法?
4nkexdtk

4nkexdtk1#

如果使用池连接,您是否尝试过此方法

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
qco9c6ql

qco9c6ql2#

我不使用池,但这段代码可以工作

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);

相关问题