【问题标题】:Query timeout in pg-promisepg-promise 中的查询超时
【发布时间】:2018-02-19 23:01:51
【问题描述】:

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

【问题讨论】:

    标签: node.js postgresql pg-promise


    【解决方案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
    });
    

    【讨论】:

    • 我主要关心网络问题:主题应用程序中的查询本身非常简单,但有时与数据库的网络连接可能会在一段时间内显着退化,我希望请求承诺在可预测的范围内失败一段时间,这样客户就会得到他的错误,而不是像 nginx 超时。
    • @Resure 如果查询花费的时间太长——要么是数据库设计问题,要么是查询规划问题。正如我上面解释的那样,试图强制超时是一种糟糕的技巧。
    • 完全同意这一点,但也许您误读了评论:如果是网络问题而不是数据库设计问题怎么办?或者您的意思是连接问题也是设计问题?
    • @Resure 我的意思是——长时间运行的查询是一个设计问题。有办法避免它。然后你就不用担心网络了,因为库是建立在自动恢复连接的连接池上的,所以任何查询都可以成功地重新运行。
    • 使用 bluebirds .timeout 会拒绝承诺,但 pg-promise 包装了异步代码,该代码在数据库上运行查询,两者都没有拒绝/取消承诺的概念。
    猜你喜欢
    • 2020-01-17
    • 2017-07-22
    • 2020-09-05
    • 2020-08-03
    • 2019-02-11
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多