[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(); 直接釋放資源。

 

參考資料

1.在Node.js使用mysql模塊時遇到的坑

2.connection-pools-in-node-mysql-for-node-js


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM