当前位置: 首页 > 面试题库 >

pg-promise中的查询超时

何超英
2023-03-14
问题内容

我想将超时添加到pg-
promise查询,以便如果数据库尚未响应,则在一段时间后它们将失败。有什么建议的方法吗?还是我应该做一个可以处理定时器并拒绝诺言的自定义包装器(如果为时已晚)?


问题答案:

来自pg-promise的作者…

pg-promise不支持查询取消,因为它可以解决数据库设计错误或查询执行不正确的问题。

PostgreSQL支持在执行耗时的查询时应使用的事件,因此无需等待,可以将事件侦听器设置为在特定数据/视图可用时触发。请参阅“
侦听/提示”示例

您可以使用自己的自定义查询方法扩展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 => {})

也可以看看:

  • 扩展事件
  • Bluebird.timeout

更新

从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
});


 类似资料:
  • 问题内容: 我是node(express)和pg-promise的新手,还无法弄清楚如何将每个嵌套查询(loop)的结果添加到主json数组结果查询中。 我有两个表:帖子和评论。 因此,我想将每个评论的结果添加到每个帖子中并返回帖子。我有这个,但是不起作用: 答案: 选项1(最佳选择) : 通过JSON到psql进行单个查询( JSON查询 ) 参见@ vitaly-t的回答 要么 使用ajax异

  • 我有一个API调用,它需要从MySQL数据库中提取一些信息,以便完成请求。问题是,NodeJS不会等待查询响应,我已经尝试用承诺来解决这个问题。下面是我的代码: 这个函数将返回Promise对象,这将触发SQL语法错误,因为这不是预期的数据库输入。我做错了什么?任何建议都非常感谢。

  • 我想使用单个查询插入多行,例如: 是否有一种方法可以轻松做到这一点,最好是针对如下对象数组: 我最终可能会在一个块中有500条记录,因此不希望运行多个查询。 到目前为止,我只能为单个对象执行此操作: 顺便问一个问题:使用< code>${}符号的插入是否可以防止SQL注入?

  • 问题内容: 我想用一个查询插入多个行,例如: 有没有一种方法可以轻松地做到这一点,最好是针对这样的对象数组: 我可能最终将500条记录放在一个块中,因此运行多个查询将是不可取的。 到目前为止,我只能对单个对象执行此操作: 附带的问题:使用符号插入是否可以防止SQL注入? 问题答案: 我是pg-promise的作者。 在旧版本的库中,Performance Boost文章中的简化示例涵盖了这一点,在

  • 问题内容: 我命中了要通过自定义开发层进行Solr的查询,而我在该层中超时的一些查询仍在solr实例中。solr中是否有一个可用于使特定查询超时的参数 问题答案: 如Solr中所述,客户端断开连接后查询继续吗?并写在Solr常见问题解答中 在内部,Solr不会使任何请求超时-它使更新和查询都需要花费很长时间才能完全处理。 但是在FAQ的同一位置 但是,用于运行Solr的servlet容器可能会对所

  • 我有一个非常大的HBASE/Phoenix表,我试图使用SQLLINE查询它。我得到以下异常。我尝试在客户端和服务器上更改各种设置: 我试着将以上所有设置为6000000,但仍然得到同样的问题。有什么想法吗?原来的异常似乎是hbaseClient.calltimeoutException。