如果不想程序在查询数据时卡死或等待过长时间,一般不推荐在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;