23

db トランザクションまたは db クエリのpsycopg2でタイムアウトを設定する方法はありますか?

ユースケースの例:
Heroku は django Web リクエストを 30 秒に制限し、その後、まだ返されていないトランザクションを django が適切にロールバックすることを許可せずに、Heroku はリクエストを終了します。これにより、postgre で未処理のトランザクションが開いたままになる可能性があります。データベースでタイムアウトを設定することもできますが、メンテナンス スクリプト分析などの Web 関連以外のクエリも制限されます。この場合、ミドルウェア (または django ) を介してタイムアウトを設定することをお勧めします。

4

3 に答える 3

43

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

環境変数を使用して設定することもできます。

>>> 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
于 2013-12-17T12:38:04.877 に答える
12

SQL を使用して、いつでもステートメントごとのタイムアウトを設定できます。例えば:

SET statement_timeout = '2s'

は、2 秒以上かかるステートメント (後続のステートメント) を中止します (「s」または「ms」として任意の有効な単位を使用できます)。ステートメントがタイムアウトすると、psycopg は例外を発生させることに注意してください。例外をキャッチして適切に対処するのはユーザーの責任です。

于 2013-11-20T16:26:03.563 に答える