Error: Connection lost: The server closed the connection

今天遇到一个问题是shopnc的im没更新已读的消息

在本地别人的机器上没问题,可以修改消息状态,而我机器上不行

输出错误

Error: Connection lost: The server closed the connection.

show global variables like '%timeout%'; 

发现我的wait_timeout 设置的100

而别人的机器是28800

wait_timeout的变量,表示操作超时时间,当连接超过一定时间没有活动后,会自动关闭该连接,这个值默认为28800(即8小时)

1.普通链接

db = mysql.createConnection(db_config.config);
function handleDisconnect() {
	db = mysql.createConnection(db_config.config);
  	db.on('error', function(err) {
    	if (!err.fatal) {
      		return;
    	}
    	if (err.code === 'PROTOCOL_CONNECTION_LOST') {
      		handleDisconnect();
    	}else{
    		console.log('mysql error: ' + err.code);
      		throw err;
    	}
  	});
  	db.connect(function(err) {
  		if (err){
  			console.log('error when connecting to db:', err);
  			setTimeout(handleDisconnect , 2000);
  		}
  		console.log('   mysql connected');
  	});
}
handleDisconnect();

 2.连接池

var pool = mysql.createPool(db_config.config); 
pool.getConnection(function(err, connection) {
	if(err){
		console.log('   mysql-pool connected fail.');
		console.error('   ' + (err.stack || err));
	} else {
		console.log('   mysql-pool connected success.');
	}
});
var query=function(sql,callback){  
    pool.getConnection(function(err,conn){  
        if(err){
			console.log('   mysql-pool connected fail.');
			console.error('   ' + (err.stack || err));
            callback(err,null);  
        }else{
            conn.query(sql,function(qerr,vals){  
                conn.release();  
                callback(qerr,vals);  
            });  
        }  
    });  
};

  为每一个请求都建立一个connection使用完后调用connection.release(); 直接释放资源

为了提高数据库的IO速度,会使用连接池做处理,但是在高并发的情况下,一条连接完成任务后不释放掉, 会导致链接池满负载 ,后面的请求将无法处理,程序就会出现阻塞

mysql的wait_timeout应设置的小一些

posted @ 2017-03-27 23:38  慕尘  阅读(3908)  评论(0编辑  收藏  举报