【问题标题】:set transaction\query timeout in psycopg2?在 psycopg2 中设置事务\查询超时?
【发布时间】:2013-11-26 15:42:53
【问题描述】:

有没有办法在psycopg2 中为数据库事务或数据库查询设置超时?

示例用例:
Heroku 将 django 网络请求限制为 30 秒,之后 Heroku 终止请求,不允许 django 优雅地回滚任何尚未返回的事务。这可能会使未完成的事务在 postgres 上处于打开状态。您可以在数据库中配置超时,但这也会限制与 Web 无关的查询,例如维护脚本分析等。在这种情况下,最好通过中间件 (or via django) 设置超时。

【问题讨论】:

    标签: heroku transactions timeout psycopg2


    【解决方案1】:

    看起来 PostgreSQL 9.6 添加了空闲事务超时。见:

    Heroku 也支持 PostgreSQL 9.6,所以你应该可以使用它。

    【讨论】:

      【解决方案2】:

      您可以使用选项参数设置连接时的超时时间。语法有点奇怪:

      >>> import psycopg2
      >>> cnn = psycopg2.connect("dbname=test options='-c statement_timeout=1000'")
      >>> cur = cnn.cursor()
      >>> cur.execute("select pg_sleep(2000)")
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      psycopg2.extensions.QueryCanceledError: canceling statement due to statement timeout
      

      也可以使用环境变量来设置:

      >>> import os
      >>> os.environ['PGOPTIONS'] = '-c statement_timeout=1000'
      >>> import psycopg2
      >>> cnn = psycopg2.connect("dbname=test")
      >>> cur = cnn.cursor()
      >>> cur.execute("select pg_sleep(2000)")
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      psycopg2.extensions.QueryCanceledError: canceling statement due to statement timeout
      

      【讨论】:

      • 请注意,如果要以秒为单位,语法需要在整数值后面加上's'字符:'-c statement_timeout=10s'表示10秒。否则,它会将值视为毫秒。
      • @piro :statement_timeout 的默认值是多少?在我的 postgres (9.3) 版本中,它设置为 0,在我看来,postgres 会让查询基本上永远运行,哈哈。 psycopg2 默认情况下是否以相同的方式工作?我知道这是一个旧线程,但谢谢:D
      • @dmn:是的,默认情况下 postgres 不设置任何语句超时。每个数据库(在配置文件中)、每个用户(ALTER USER ... SET statement_timeout)、每个连接(根据上面的响应)、每个会话或查询(使用 SET 或 SET LOCAL)可以更改默认值。 psycopg 只使用服务器定义的任何内容,或者客户配置的内容,或者连接字符串配置的内容,它不会添加自己的任何内容。
      • 相关问题 - 是否可以在连接上而不是在每个语句的基础上设置超时?
      • @KarlAnka 您可能正在寻找 idle_in_transaction_session_timeout
      【解决方案3】:

      您可以随时使用 SQL 设置每个语句的超时。例如:

      SET statement_timeout = '2s'
      

      将中止任何花费超过 2 秒的语句(跟随它)(您可以使用任何有效的单位作为“s”或“ms”)。请注意,当语句超时时,psycopg 会引发异常,您需要注意捕捉它并采取适当的行动。

      【讨论】:

      • 很高兴知道,但是使用这个 per 语句会产生开销
      • 此设置不是每个语句,此设置适用于在其后的连接(或游标,不确定)上所做的所有语句。
      • 使用 SET LOCAL 进行每个事务的设置或使用 SET SESSION 进行每个会话 postgresql.org/docs/9.3/static/sql-set.html
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 2017-06-29
      • 1970-01-01
      • 2016-09-09
      • 2016-06-20
      • 1970-01-01
      相关资源
      最近更新 更多