nodejs解決mysql和連線池(pool)自動斷開問題
阿新 • • 發佈:2019-01-01
最近在做一個個人專案,資料庫嘗試使用了mongodb、sqlite和mysql。分享一下關於mysql的連線池用法。專案部署於appfog,專案中我使用連線池連結資料庫,本地測試一切正常。上線以後,經過幾次請求兩個資料介面總是報503。一直不明就裡,今天經過一番排查終於順利解決了。
1.mysql 連結普通模式
2.使用連線池
對於丟失連線的問題,可以使用連線池(最新版mysql模組,用mysql.createPool()來建立的pool,當觸發了connection的error事件時,會把該connection物件從連線池中移除。)
1.mysql 連結普通模式
var mysql = require('mysql'), env = { host : 'localhost', user : 'root', password : '2212', database : 'image_marker' }; db = mysql.createConnection(env); db.connect(); exports.do = function (sql, callback) { db.query(sql, callback); }
MySQL中有一個名叫wait_timeout的變數,表示操作超時時間,當連線超過一定時間沒有活動後,會自動關閉該連線,這個值預設為28800(即8小時)。對於這種普通連線的方式,在正式線上可能會遇到連線丟失的問題(No reconnection after connection lost錯誤日誌),上github上看了下文件和issues,上面說到連線丟失後不會自動重新連線,會觸發error事件。 所以可以使用下面這種方法來避免連線對視問題:
function handleError (err) { if (err) { // 如果是連線斷開,自動重新連線 if (err.code === 'PROTOCOL_CONNECTION_LOST') { connect(); } else { console.error(err.stack || err); } } } // 連線資料庫 function connect () { db = mysql.createConnection(config); db.connect(handleError); db.on('error', handleError); } var db; connect();
2.使用連線池
對於丟失連線的問題,可以使用連線池(最新版mysql模組,用mysql.createPool()來建立的pool,當觸發了connection的error事件時,會把該connection物件從連線池中移除。)
var mysql = require('mysql'); var pool = mysql.createPool(config); pool.getConnection(function(err, connection) { // Use the connection connection.query( 'SELECT something FROM sometable', function(err, rows) { // And done with the connection. connection.end(); // Don't use the connection here, it has been returned to the pool. }); });
參考:https://cnodejs.org/topic/51cd3bcc73c638f3705998f5
使用了連線池後,有網友說每一次請求都用pool建立一個connection,改進我的程式碼如下連線:
http://www.2cto.com/kf/201404/292016.html