查询时间过长时,psycopg2光标会挂起

时间:2015-08-29 12:41:15

标签: python python-3.x psycopg2

我在Python中使用psycopg2执行长时间查询时遇到问题。 当查询花费超过180秒时,脚本执行会挂起很长时间。

我使用Python 3.4.3psycopg2 2.6.1

以下是重现此问题的示例:

import psycopg2

cnn = psycopg2.connect(
    database='**********',
    user='**********',
    password='**********',
    host='**********',
    port=5432,
)
print("Connected")
cursor = cnn.cursor()
seconds = 5
print("Sleep %s seconds"%seconds)
cursor.execute("SELECT pg_sleep(%s);"%seconds)
print("Exit.")

当查询需要5秒时脚本正常工作:

$python3 /tmp/test.py 
Connected
Sleep 5 seconds
Exit.

但是当秒数大约为180或更大时,行cursor.execute将挂起,并且以下说明永远不会执行:

import psycopg2

cnn = psycopg2.connect(
    database='**********',
    user='**********',
    password='**********',
    host='**********',
    port=5432,
)
print("Connected")
cursor = cnn.cursor()
seconds = 180
print("Sleep %s seconds"%seconds)
cursor.execute("SELECT pg_sleep(%s);"%seconds)
print("Exit.")

这是一个输出:

$python3 /tmp/test.py 
Connected
Sleep 5 seconds
<Never exit>

有谁知道如何解决这个问题? 谢谢。

1 个答案:

答案 0 :(得分:1)

您可能在某处设置了语句超时。尝试将其关闭以用于单个语句:

cursor = cnn.cursor()
seconds = 180

# Turn statement_timeout off for the next query
cursor.execute("SET statement_timeout = 0")

print("Sleep %s seconds"%seconds)
cursor.execute("SELECT pg_sleep(%s);"%seconds)
print("Exit.")

如果此方法有效,请更改默认值,无论您定义它还是仅用于连接:

cnn = psycopg2.connect(
    database='**********',
    user='**********',
    password='**********',
    host='**********',
    port=5432,
    options='-c statement_timeout=0'
)