標籤:
如果不想程式在查詢資料時卡死或等待過長時間,一般不推薦在node中開啟一個串連後全部查詢都用這個連結並且不關閉。因為node裡面的mysql不像php裡的那樣會在完成查詢後斷開,只要不主動斷開,串連一直存在,當串連數量達到一定數量時就會產生嚴重的阻塞,出現各種延時和卡死現象。在並發量較大時,可以通過建立串連池來緩解並發壓力。
在node中的mysql模組裡其用來操作資料的query()方法接收的參數是不同的,在使用時需要特別注意。具體模組如下:
/** * mysql串連池模組 * @author jeri * @time 2016.5.24 */var mysql=require("mysql");/** * 串連池建立 * @pool {object} */var pool = mysql.createPool({ host: ‘localhost‘, user: ‘root‘, password: ‘‘, database: ‘movielens‘, port: 3306 }); /** * select和delete操作 * @param {string} sql sql語句 * @param {Function} callback 回呼函數 * @return {none} */var sdQuery=function(sql,callback){ pool.getConnection(function(err,conn){ if(err){ console.log(‘CONNECT ERROR:‘, err.message); callback(err,null,null); }else{ conn.query(sql,function(qerr,vals,fields){ //釋放串連 conn.release(); //事件驅動回調 callback(qerr,vals,fields); }); } }); }; /** * update和insert操作 * @param {string} sql sql語句 * @param {array} params 參數數組 * @param {Function} callback 回呼函數 * @return {none} */var uiQuery=function(sql,params,callback){ pool.getConnection(function(err,conn){ if(err){ console.log(‘CONNECT ERROR:‘, err.message); callback(err,null,null); }else{ conn.query(sql,params,function(qerr,vals,fields){ //釋放串連 conn.release(); //事件驅動回調 callback(qerr,vals,fields); }); } }); }; /** * query函數重載 * @return {none} */var query = function(){ var len = arguments.length; if(len==2) { var sql = arguments[0]; var cb = arguments[1]; sdQuery(sql, cb); } else if(len == 3){ var sql = arguments[0]; var params = arguments[1]; var cb = arguments[2]; uiQuery(sql, params, cb); } else { console.log(‘ERROR:‘, ‘傳參不對‘); }};// 暴露介面module.exports = query;
mysql串連池模組