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

最近在做一個個人項目,數據庫嘗試使用瞭mongodb、sqlite和mysql。分享一下關於mysql的連接池用法。項目部署於appfog,項目中我使用連接池鏈接數據庫,本地測試一切正常。上線以後,經過幾次請求兩個數據接口總是報503。一直不明就裡,今天經過一番排查終於順利解決瞭。

 

 

 

1.mysql 鏈接普通模式

 

 

 

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小時)。關於普通用法鏈接丟失後重新鏈接,請看這裡 傳送門

 

 

 

2.使用連接池

 

之前我的錯誤代碼,官網上隻給出瞭連接池用法,但是沒有給出和請求結合的實例。由於欠缺經驗,我認為多個請求使用一個connection比較節省資源。後面發現,connetion經過一段時間後會自動斷開,這樣問題就出現瞭。

 

復制代碼

pool.getConnection(function (err, connection){

    exports.do = function (sql, callback){

        

        connection.query(sql, function (){

            callback.apply(connection, arguments);

            connection.release();

        });

    }

})

復制代碼

google/baidu後發現瞭一個使用pool的實例

 

 

 

發現他的代碼每一次請求都用pool創建一個connection,改進我的代碼終於解決瞭一段時間後connection自動斷開的問題。

 

 

 

正確代碼為

 

復制代碼

pool  = mysql.createPool(env);

 

    exports.do = function (sql, callback){

        this.getConnection(function (err, connection){

            connection.query(sql, function (){

                callback.apply(connection, arguments);

                connection.release();

            });

        })

    }.bind(pool)

復制代碼

為每一個請求都建立一個connection使用完後調用connection.release(); 直接釋放資源。

發佈留言