PostgreSQL是否缓存了我的查询?

5

我有一段相当简单的 Python 代码片段,用于运行一个 Postgres 查询并将结果发送到仪表板。我使用 psycopg2 定期运行相同的查询。暂时不用担心循环机制。

    conn = psycopg2.connect(<connection info>)

    while True:
        # Run query and update dashboard
        cur = conn.cursor()
        cur.execute(q_tcc)
        query_results = cur.fetchall()

        update_dashboard(query_results)
        time.sleep(5)

供参考,实际查询为:

q_tcc = """SELECT client_addr, application_name, count(*) cnt FROM pg_stat_activity
       GROUP BY client_addr, application_name ORDER BY cnt DESC;"""

当我运行这个程序时,即使结果应该会发生变化,但我仍然得到相同的结果。如果我将psycopg2.connect()语句移动到循环中,并加上conn.close(),则一切都正常工作。然而,根据连接和游标文档,我应该能够在整个过程中继续使用相同的游标(因此也是连接)。这是否意味着Postgres正在按客户端连接缓存我的查询?

sleep 之前,你应该很可能关闭你的游标。 - Dmitri Goldring
我尝试过了,但没有成功,这与文档一致:“现在关闭游标(而不是在执行del时)。从此时起,游标将无法使用;如果尝试使用游标进行任何操作,则会引发InterfaceError异常。” - s g
1个回答

7

PostgreSQL没有查询缓存。

但是,如果您使用的是SERIALIZABLE隔离级别,由于您似乎在单个事务中执行所有查询,因此您可能会看到相同的数据快照。

在循环中的每次查询后,您应该真正提交(或回滚)事务。conn.rollback()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接