簡體   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