我正在使用带有连接池的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()
向下移几行。但是如果抛出错误会发生什么?连接是否永远不会返回池中?
我是否必须使用某个控制流程库来获得“最终”时刻才可以释放它? 有更好的想法吗?
答案 0 :(得分:3)
可以处理的一种方法是承诺。由于您正在构建池,因此您可以使用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);
});
});
所以,将你的其他几个调用包装成这样的promises,然后只编写你的查询:
db.getConnection()
.then(function(conn){
makeRequest()
.then(...)
...
.catch(function(err){
// at the end you release the conn
});
它看起来像你要求的东西吗?
答案 1 :(得分:1)
当您执行MySQL查询时,它会锁定数据库,直到查询完成。成功完成查询后,它会释放该数据库锁。
此处的情况相同:connection.release();
只是释放数据库连接,没有别的。
答案 2 :(得分:0)
您应该为这种情况使用单独的连接。这就是连接池的用途。这样就不必等待另一个人在它开始之前完成。如果一个查询在另一个查询完成之前无法启动,我只使用相同的连接。