Nodejs(通用池):捕获错误时释放资源

时间:2018-03-21 10:28:32

标签: node.js connection-pooling

根据node-pool,获取资源的过程如下:

 const resourcePromise = myPool.acquire();
  resourcePromise
  .then(function(client) {
    client.query("select * from foo", [], function() {
      // return object back to pool
      myPool.release(client);
    });
  })
  .catch(function(err) {
    // handle error 
  });

想象一下,我有一个处理数据时发生异常的情况(在获取资源之后和发布之前)

就像下面的例子一样:

const resourcePromise = myPool.acquire();
resourcePromise
  .then(function(client) {
    client.query("select * from foo", [], function() {
      throw new Error('unknown error');
      myPool.release(client);
    });
  })
  .catch(function(err) {
    // how can I release the resource here?
  });

如何释放资源呢?

1 个答案:

答案 0 :(得分:1)

有几种方法。全局获取客户端钩子:

let client;
resourcePromise
  .then(c=> {
      client = c;
      return query.whatever();
   })
  .catch(() => {
    resource.release(client);
  });

或者Bluebird的finally之类的东西可以提供帮助:

let client;
resourcePromise
  .then(c=> {
      client = c;
   })
  .catch(/* whatever else */)
  .finally(() => {
    resource.release(client);
  })

你必须确保处理超时,但是如果承诺永远不会解决(成功或不成功),你永远不会进入任何处理程序。

另一种方法是处理承诺链中的错误:

resourcePromise.then(function (client) {
  return query.whatever(client)
    .catch(() => resource.release(client));
});