在psycopg2中设置transaction \ query timeout?

时间:2013-11-13 20:44:18

标签: heroku transactions timeout psycopg2

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

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

3 个答案:

答案 0 :(得分:23)

您可以使用options参数在连接时设置超时。语法有点奇怪:

>>> 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

也可以使用env变量进行设置:

>>> 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

答案 1 :(得分:7)

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

SET statement_timeout = '2s'

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

答案 2 :(得分:1)

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

Heroku也支持PostgreSQL 9.6,因此您应该能够使用它。