Nodejs(Generic Pool):捕获错误时释放资源
Nodejs (Generic Pool): release the resource when catching an error
根据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?
});
那我怎么释放资源呢?
几种方式。全局获取客户端挂钩:
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);
})
不过,您还必须确保处理超时 - 万一 promise 永远无法解决(成功与否),您永远不会进入任何处理程序。
另一种方法是处理promise链中的错误:
resourcePromise.then(function (client) {
return query.whatever(client)
.catch(() => resource.release(client));
});
根据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?
});
那我怎么释放资源呢?
几种方式。全局获取客户端挂钩:
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);
})
不过,您还必须确保处理超时 - 万一 promise 永远无法解决(成功与否),您永远不会进入任何处理程序。
另一种方法是处理promise链中的错误:
resourcePromise.then(function (client) {
return query.whatever(client)
.catch(() => resource.release(client));
});