【问题标题】:Promise-MySQL cannot release connections back to the poolPromise-MySQL 无法释放连接回池
【发布时间】:2016-05-31 04:33:01
【问题描述】:

我是 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 发出请求时,连接仍保留在池的_allConnections 数组中解决它,_freeConnections 数组中绝对没有任何连接。

有谁知道我怎样才能让连接再次免费?

【问题讨论】:

    标签: mysql node.js promise


    【解决方案1】:

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

    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);
    

    【讨论】:

    • 哦,我错过了那个!比我的更好的解决方案 =D
    • 好的,非常感谢。有没有办法释放连接,在连接方法中,这样我就不用每次想写一个使用connect()查询的方法时都重写一些东西?
    • 我会创建一个通用查询(queryString)函数来获取连接,运行查询,将连接返回到池,然后返回查询的结果。我希望这是有道理的。
    • @DomFarolino,"有没有办法释放连接,在连接方法中..."。试试Disposer Pattern
    【解决方案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();
          }
        });
      }
      

    【讨论】:

    • 是的,我在最后一次使用 conn.end() 进行测试,不知道为什么要恢复它。是的,我没有逃避,因为我们只在另一个数据库中存在该使用时才运行此查询。我们检查他们是否通过对另一个内部公司应用程序的 API 调用进行检查,但这是个好主意,谢谢,永远不会太安全
    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 2013-05-01
    • 2016-10-24
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多