最近在做一個個人項目,數據庫嘗試使用了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(); 直接釋放資源。
參考資料