mysql连接问题,连接断开的问题,连接数不释放的问题
发布于 6 年前 作者 frosh 14333 次浏览 最后一次编辑是 3 年前

这个问题cnode上面有过解释 监控disconnection事件,使用普通的连接,最好不使用连接池

代码如下,我再贴一次

function handleDisconnect(connection) {
  connection.on('error', function(err) {
    if (!err.fatal) {
      return;
    }   

    if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
      throw err;
    }   

    console.log('Re-connecting lost connection: ' + err.stack);

    connection = mysql.createConnection(connection.config);
    handleDisconnect(connection);
    connection.connect();
  }); 
}   

handleDisconnect(connection);

但是就算是这样,也会有个问题,在用户用F5按住不松的情况下去刷新页面,mysql中用show processlist查看连接数的时候会发现,有部分连接是不会断开的,也不会被复用,其实就是因为这种情况下的mysql连接没有被主动断开,所以需要在这个代码中加入断开连接的代码

function handleDisconnect(connection) {
  connection.on('error', function(err) {
    if (!err.fatal) {
      connection.end();
      return;
    }   

    if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
      connection.end();
      throw err;
    }   

    console.log('Re-connecting lost connection: ' + err.stack);

    connection = mysql.createConnection(connection.config);
    handleDisconnect(connection);
    connection.connect();
  }); 
}   

handleDisconnect(connection);

这样就同时解决了两个问题。至少我最后上线的代码是OK的了

至于使用POOL模式怎么处理这个问题,我还没有找到,有人说过用mysql@2.0的一个包可以解决,实际上使用发现无法解决,数据库重启后连接实际上不可用,虽然不会报错,所以还是建议使用这种方式。

1 回复

你好,我也是在mysql中show processlist的时候有好多sleep的,原因是打开链接就未曾关闭,我需要执行完一个sql后及时关闭么?

回到顶部