首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置query_timeout与statement_timeout的关系?

问如何设置query_timeout与statement_timeout的关系?
EN

Stack Overflow用户
提问于 2019-12-03 10:59:47
回答 1查看 4.5K关注 0票数 6

我们可以为客户端设置2个超时

  • statement_timeout:查询中语句超时之前的毫秒数,默认情况下不超时
  • query_timeout查询调用之前的毫秒数将超时,默认情况下不超时

我是这样理解的:

  • statement_timeout将传递给数据库(请参阅超时),当语句花费的时间超过此时,数据库将中止查询并返回一个错误。
  • 数据库不知道任何关于query_timeout的信息。这是由驱动器(node-postgres)处理的。当达到此超时时,node-postgres将停止侦听响应,但数据库可能仍在执行查询。

问题1我们应该设置查询超时略长于语句超时吗?

我想是因为:

  1. 当查询确实花费太长时间时,db将中止查询并将错误返回给客户端。
  2. 当应用程序在查询超时内没有从服务器获得任何响应时,应用程序将抛出一个超时错误。 问题2:这可能是什么原因?例如TCP/IP连接的问题?

交易记录

当我们使用事务处理时,情况如何?

当我们看文档中的示例时

代码语言:javascript
复制
  try {
    await client.query('BEGIN')
    const queryText = 'INSERT INTO users(name) VALUES($1) RETURNING id'
    const res = await client.query(queryText, ['brianc'])
    const insertPhotoText = 'INSERT INTO photos(user_id, photo_url) VALUES ($1, $2)'
    const insertPhotoValues = [res.rows[0].id, 's3.bucket.foo']
    await client.query(insertPhotoText, insertPhotoValues)
    await client.query('COMMIT')
  } catch (e) {
    await client.query('ROLLBACK')
    throw e
  }

因此,在愉快路径中,我们调用query() 5次:在每个query()调用中应用查询/语句超时。

问题3所以BEGIN/COMMIT查询也有相同的超时a INSERT查询,对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-18 13:48:22

经过一些使用pg承诺的测试后,我得出了这样的结论:query-timeout应该比statement-timeout稍长一些。

详细信息

仅查询超时

  • query-timeout =10秒
  • statement-timeout =未定义

在一个事务中,我们发送pgsleep(60) (睡眠60秒)

然后这种情况就会发生:

  • 将BEGIN语句发送到db。
  • 然后将pgsleep(60)发送到db。
  • 10秒后,我们到达查询超时:节点-postgres将通知pg-诺言。
  • 承诺会派ROLLBACK 去
    • 由于连接仍在执行睡眠-60,所以回滚必须等待。
    • 再过10秒钟,pg-承诺将返回一个Query read timeout error

  • 数据库将在剩余时间内继续执行睡眠语句。

语句-仅限超时

  • query-timeout =未定义
  • statement-timeout =10秒

在一个事务中,我们发送pgsleep(60) (睡眠60秒)

然后这种情况就会发生:

  • 将BEGIN语句发送到db。
  • 然后将pgsleep(60)发送到db。
  • 10秒后,数据库将中止睡眠,回滚事务并向客户端发送一个错误:57014:canceling statement due to statement timeout
  • 应用程序可以处理错误,连接被释放。

因此,我们应该更倾向于获得一个statement-timeout,并设置稍微长一点的query-timeout,以防数据库无法发回错误(我想,当出现网络问题时,情况可能是这样)。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59155572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档