1. 程式人生 > >nodejs解決mysql和連線池(pool)自動斷開問題

nodejs解決mysql和連線池(pool)自動斷開問題

        最近在做一個個人專案,資料庫嘗試使用了mongodb、sqlite和mysql。分享一下關於mysql的連線池用法。專案部署於appfog,專案中我使用連線池連結資料庫,本地測試一切正常。上線以後,經過幾次請求兩個資料介面總是報503。一直不明就裡,今天經過一番排查終於順利解決了。
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