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