我们使用一个对象来保持与 PostgreSQL 数据库的连接并创建新的游标来服务请求。我观察到奇怪的行为:即使读取响应并关闭游标,请求仍然挂在数据库中,阻止更新表等。
当连接关闭时,它就会消失。
我知道 ORM 框架,也许最终会使用其中之一,但我只想了解这里发生了什么。为什么请求仍然存在?
这是python代码:
import psycopg2
def main():
conn = psycopg2.connect("dbname=tmpdb password=1 host=localhost")
cur = conn.cursor()
cur.execute("SELECT 1;")
items = cur.fetchall()
cur.close()
#uncommenting the following line solves the problem
#conn.close()
print items
while True:
pass
main()
以下是如何启动代码:
>python test_loop.py
[(1,)]
以下是观察挂起请求的方法:
tmpdb=# SELECT datname,usename,pid,client_addr,waiting,query_start,query FROM pg_stat_activity ;
datname | usename | pid | client_addr | waiting | query_start | query
---------+----------+-------+-------------+---------+-------------------------------+------------------------------------------------------------------------------------------
tmpdb | savenkov | 530 | ::1 | f | 2013-08-12 13:56:32.652996+00 | SELECT 1;
tmpdb | savenkov | 88351 | | f | 2013-08-12 13:56:35.331442+00 | SELECT datname,usename,pid,client_addr,waiting,query_start,query FROM pg_stat_activity ;
(2 rows)