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