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