pg-promise中的查询超时

时间:2017-09-11 16:20:06

标签: node.js postgresql pg-promise

我想为pg-promise查询添加超时,这样如果数据库尚未响应,它们将在一段时间后失败。 有没有推荐的方法可以做到这一点,或者我应该制作自定义包装器来处理计时器并拒绝承诺如果为时已晚?

1 个答案:

答案 0 :(得分:1)

来自pg-promise的作者......

pg-promise不支持查询取消,因为它是解决错误数据库设计或错误查询执行的黑客攻击。

PostgreSQL支持在执行耗时的查询时应该使用的事件,因此可以设置在特定数据/视图可用时触发的事件侦听器,而不是等待。请参阅LISTEN/NOTIFY示例。

您可以使用您自己的自定义查询方法扩展pg-promise,该方法将使用拒绝超时(请参阅下面的示例),但这又是设计问题的另一种解决方法。

使用Bluebird的示例:

const Promise = require('bluebird');

Promise.config({
    cancellation: true
});


const initOptions = {
    promiseLib: Promise,
    extend(obj) {
        obj.queryTimeout = (query, values, delay) => {
            return obj.any(query, values).timeout(delay);
        }
    }
};

const pgp = require('pg-promise')(initOptions);
const db = pgp(/* connection details */);

然后您可以在每个级别使用db.queryTimeout(query, values, delay)

或者,如果您使用Bluebird,则可以将.timeout(delay)链接到任何现有方法:

db.any(query, values)
    .timeout(500)
    .then(data => {})
    .catch(error => {})

另见:

<强>更新

从版本8.5.3开始,pg-promise通过连接对象中的属性query_timeout开始支持查询超时。

您可以覆盖默认值:

pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds

或者在连接对象中指定它:

const db = pgp({
    /* all connection details */

    query_timeout: 3000
});