最近在做一個個人項目,資料庫嘗試使用了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,改進My Code終於解決了一段時間後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(); 直接釋放資源。