在一条sql执行的时间内,如果来了1000条访问请求,那么一次查询结果将返回给1000条请求,
var EventProxy = require('eventproxy');
var proxy = new EventProxy();
var status = "ready";
var select = function(callback){
proxy.once("selected",callback);
if(status == "ready"){
status = "pending";
db.select("SQL", function(results){
proxy.emit("selected",results);
status = "ready";
});
}
}
function query(sql, sqlParams, callback) {
pool.getConnection(function (err, conn) {
if (err) {
callback(err, null, null);
} else {
conn.query(sql, sqlParams, function (qerr, vals, fields) {
callback(qerr, vals, fields);
});
}
// conn.release(); // not work!!!
pool.releaseConnection(conn);
});
};
exports.init = function (config) {
pool = mysql.createPool({
host: config.HOST,
user: config.USER,
password: config.PSWD,
database: config.DB,
port: config.PORT,
});
};
并发访问时,通过conn.release()释放连接不成功,导致一定访问达到连接数上限后,pool.getConnection直接卡死没有任何的回调! 需要改成pool.releaseConnection(conn)
//上面其实是错误的,应该是这样,放到query以后
let pool = mysql.createPool(mysql_config);
module.exports={
select : function(sql,params,callback){
if(sql.toLowerCase().indexOf('select') == -1){
console.log('非查询语句不可使用!');
return false;
}
pool.getConnection(
function(err,connection){
if(err){
callback(err,null,null);
return false;
}
connection.query(sql,params,function(err,results,fields){
//释放连接
connection.release();
//事件驱动回调
callback(err,results,fields);
});
});
}
};
mysql连接查看
1:查看当前连接
mysql> show status like ‘Threads%’; ±------------------±------+ | Variable_name | Value | ±------------------±------+ | Threads_cached | 58 | | Threads_connected | 57 | ###这个数值指的是打开的连接数 | Threads_created | 3676 | | Threads_running | 4 | ###这个数值指的是激活的连接数,这个数值一般远低于connected数值 ±------------------±------+
Threads_connected 跟show processlist结果相同,表示当前连接数。准确的来说,Threads_running是代表当前并发数
2:这是是查询数据库当前设置的最大连接数mysql> show variables like ‘%max_connections%’; ±----------------±------+ | Variable_name | Value | ±----------------±------+ | max_connections | 1000 | ±----------------±------+
3:显示连接列表mysql> show processlist;
4:显示连接状态mysql> SHOW STATUS LIKE ‘%connect%’;
linux 配置net.core.rmem_max = 33554432 net.core.wmem_max = 33554432 net.ipv4.tcp_rmem = 4096 16384 33554432 net.ipv4.tcp_wmem = 4096 16384 33554432 net.ipv4.tcp_mem = 786432 1048576 26777216 net.ipv4.tcp_max_tw_buckets = 360000 net.core.netdev_max_backlog = 2500 vm.min_free_kbytes = 65536 vm.swappiness = 0 net.ipv4.ip_local_port_range = 1024 65535
sysctl -w net.ipv4.tcp_tw_recycle=1 sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.ip_local_port_range=“2000 65535” 如果可以,增加远端服务的 IP 数量也是一个有效且非常推荐的方法。