上述方法的问题在于,如果您在每次执行 *** 作后都忘记释放连接
getDb,则可能会导致资源泄漏,当应用程序耗尽资源时,该应用程序最终可能会冻结。
您可以在一处做:
var users = getDb().then(function(conn){ return conn.query("SELECt name FROM users");});
这将泄漏从未关闭过的数据库连接。
处理器模式
分配器模式是一种将代码范围与拥有资源耦合的方式。通过将资源绑定到作用域,我们确保在完成处理后始终将其释放,并且我们不能轻易忘记释放它。它类似于
usingC#
with中的Python和Java中的try-
with-resource以及C ++中的RAII。
看起来像:
在这里应用withResource(function(resource){ return fnThatDoesWorkWithResource(resource); // returns a promise }).then(function(result){ // resource disposed here });
如果我们将代码编写为:
function withDb(work){ var _db; return myDbDriver.getConnection().then(function(db){ _db = db; // keep reference return work(db); // perform work on db }).finally(function(){ if (_db) _db.release(); });}
我们可以将上面的代码编写为:
withDb(function(conn){ return conn.query("SELECt name FROM users"); }).then(function(users){ // connection released here });
处置程序模式的用户示例包括sequelize和knex(书架的查询生成器)。例如,还可以将其用于更简单的 *** 作,例如在完成所有AJAX请求后隐藏加载程序。
bluebird由于您正在使用bluebird,因此它具有专用功能
Promise.using和
.disposer内置功能,可让您立即处理可能需要考虑的多个资源。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)