的node.js

我在连接池中使用node-mysql驱动程序。

只有一个查询时将连接释放回池中很容易:

pool.getConnection(function(err, connection) {
  if (err) {
    throw err;
  }

  query = "SELECT * FROM user WHERE id = ?";
  connection.query(query, [id], function(err, users) {
    connection.release();

    if (err) {
      throw err;
    }

    // ...
  });
});

如果我需要第二次使用连接,该怎么办? 我必须将release()移动几行。 但是如果错误被抛出会发生什么? 连接是否永远不会返回到池中?

我是否必须使用一些控制流程库来有一个“终于”的时刻,我可以释放它?
任何更好的想法?


可以处理的一种方式是承诺。 既然你正在建立一个池,你可以用类似于q(或即将出现的原生承诺)的方式来构建你的请求:

// assuming you have your local getConnection above or imported
exports.getConnection = function(queryParams) {
    var d = q.defer();
    local.getConnection(function(err, conn) {
        if(err) d.reject(err);
        d.resolve(conn);
    });
});

所以,把你的其他几个呼叫包装成这样的承诺,然后编写你的查询:

db.getConnection()
.then(function(conn){
    makeRequest()
    .then(...)
    ...
.catch(function(err){
    // at the end you release the conn
});

这看起来像你要求的东西吗?


当你执行一个MySQL查询时,它会锁定数据库直到查询完成。 查询成功完成后,它释放该数据库锁定。

同样的情况在这里: connection.release(); 只是简单地释放数据库连接,没有别的。


你应该为这种情况使用单独的连接。 这就是连接池的用途。 这样一个人不必等待另一个完成才能开始。 如果一个查询在其他查询完成之前无法启动,则只使用相同的连接。

链接地址: http://www.djcxy.com/p/77299.html

上一篇: node.js

下一篇: Are unittest base classes good practice? (python/webapp2)