node-mysql – 何时释放连接回池

我正在使用连接池的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()移动几行。 但是,如果错误被抛出,会发生什么? 连接是否永远不会返回到池中?

我是否必须使用一些控制stream程lib才能释放它?
任何更好的想法?

可以处理的一个方法是承诺。 既然你正在构build一个池,你可以用q(或者即将发布的原生promise)来构build你的请求:

 // 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查询的时候,它会locking数据库,直到查询完成。 查询成功完成后,它释放该数据库locking。

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

你应该使用单独的连接来处理这种情况。 这就是连接池的用途。 这样一个人不必等待另一个完成才能开始。 我只使用相同的连接,如果一个查询无法启动,直到另一个查询完成。