我想将超时添加到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 => {})
也可以看看:
更新
从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。