gpt4 book ai didi

pg-promise - 如何设置与 statement_timeout 相关的 query_timeout?

转载 作者:行者123 更新时间:2023-12-04 11:27:21 27 4
gpt4 key购买 nike

我们可以为 Client 设置 2 个超时时间:

  • statement_timeout : 查询语句超时前的毫秒数,默认不超时
  • query_timeout查询调用超时前的毫秒数,默认为无超时

  • 我是这样理解的:
  • statement_timeout将被传递到数据库(参见 postgres-docs:statement_timeout )并且当一条语句花费的时间比这更长时,数据库将中止查询并返回错误
  • 数据库对 query_timeout 一无所知.这由驱动器 ( node-postgres ) 处理。当达到此超时时,node-postgres将停止监听响应,但数据库可能仍在执行查询

  • 问题 1 我们应该将查询超时设置为比语句超时稍长吗?

    我认为是因为那时:
  • 当查询真的花费太长时间时,数据库将中止查询并将错误返回给客户端
  • 当应用程序在查询超时内没有从服务器得到任何响应时,应用程序将抛出超时错误
    问题 2 : 这可能是什么原因?例如TCP/IP 连接问题?

  • 交易

    我们在使用事务时是什么情况?
    例如当我们看 example from the docs :

      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查询具有与 INSERT 相同的超时时间查询,对吗?

    最佳答案

    在使用 pg-promise 进行了一些测试后,我得出了这个结论:query-timeout应该比 statement-timeout 稍长
    细节
    仅查询超时

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

  • 在交易中,我们发送 pgsleep(60) ( sleep 60秒)
    然后会发生这种情况:
  • BEGIN语句发送到数据库
  • 然后 pgsleep(60)发送到数据库
  • 10 秒后,我们达到查询超时:node-postgres 将通知 pg-promise
  • pg-promise 将发送 ROLLBACK
  • 由于连接仍在执行 sleep-60,回滚将不得不等待
  • 再过 10 秒 pg-promise 将返回 Query read timeout error

  • 数据库会在剩余时间继续执行sleep语句

  • 仅语句超时
  • query-timeout = 未定义
  • statement-timeout = 10 秒

  • 在交易中,我们发送 pgsleep(60) ( sleep 60秒)
    然后会发生这种情况:
  • BEGIN语句发送到数据库
  • 然后 pgsleep(60)发送到数据库
  • 10 秒后,数据库将中止 sleep ,回滚事务并向客户端发回错误:code 57014 :canceling statement due to statement timeout
  • 应用程序可以处理错误,连接被释放

  • 所以我们应该更愿意得到一个 statement-timeout并设置 query-timeout稍长一点,以防数据库无法发回错误(我想这可能是存在例如网络问题的情况)

    关于pg-promise - 如何设置与 statement_timeout 相关的 query_timeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59155572/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com