并发
在一条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 数量也是一个有效且非常推荐的方法。
