Promise-MySQL无法释放连接回池

时间:2016-02-18 19:52:21

标签: mysql node.js promise

我是Node.js开发的新手,我正在研究一个需要我从mysql数据库中提取用户的应用程序。我正在使用promise-mysql库来查询mysql数据库。我试图使用这样的连接池:

var pool = mysql.createPool({
  host:     hgh.host,
  user:     hgh.user,
  password: hgh.pw,
  database: hgh.name,
  connectionLimit: 10
});

作为我模块中的全局变量。

然后我使用上面的函数从池中返回连接。

function connect() {
  return pool.getConnection().then(function(connection) {
    return connection
  }).catch(function(error) {
    console.log("Connect failed");
    throw ErrorModel.generateErrorObject(error, 500);
  });
}

下面是我用来查询数据库的函数:

function getUser(username) {
  var sql_query = `SELECT * FROM userstable WHERE userName = ` + `'` + username + `'`;
  return connect().then(function(conn) {
    return conn.query(sql_query).then(function(rows) {
      console.log("HGH getUser Then");
      console.log(pool);
      conn.release();
      return rows;
    });
  }).catch(function(error) {
      console.log("HGH getUser Catch");
      console.log(error);
      throw ErrorModel.generateErrorObject(error, 500);
  });
}

我遇到了这个问题:

尝试将当前连接释放到池中时,

conn.release不是函数。这是我的逻辑错吗?我的目标是建立一个包含大量连接(最多一定数量)的池,如果用户需要查询,getConnection()函数只是从池中获取一个空闲连接,或者创建一个。问题是我不能为我的生活将其作为free发回池中。每次我使用conn.end()而不是release发出请求时,连接仍然在{{1}我把它控制出来时池的数组,_allConnections数组中绝对没有连接。

任何人都知道如何再次免费连接?

2 个答案:

答案 0 :(得分:3)

查看模块的代码,我找到了从池中释放连接的功能:

pool.prototype.releaseConnection = function releaseConnection(connection) {
    //Use the underlying connection from the mysql-module here:
    return this.pool.releaseConnection(connection.connection);
};

因此,如果所有这些函数都存在于同一个文件中,则可以在getUser函数中执行以下操作: 取代

conn.release();

pool.releaseConnection(conn);

答案 1 :(得分:2)

查看代码,promise-mysql包装原始连接对象,该对象不会公开release方法。但是,原始文件被公开为名为connection的属性,因此可以使用:

conn.connection.release();

一些随意的想法:

  • 您的查询输入可能是escape

    var sql_query = `SELECT * FROM userstable WHERE userName = ${ pool.escape(username) }`;
    
  • 发生错误时,您的代码不会释放连接(因为.then()回调中的代码不会被调用);使用.finally()进行发布会更好,因为已经解决了已解决的被拒绝的情况:

    function connect() {
      var conn = null;
      return pool.getConnection().then(function(connection) {
        conn = connection;
        return connection;
      }).catch(function(error) {
        console.log("Connect failed", error);
      }).finally(function() {
        if (conn) {
          conn.connection.release();
        }
      });
    }