PostgreSQL 游标是否绑定到连接?

jla*_*rcy 3 postgresql concurrency cursors

我想用 PostgreSQL 游标确认一点。

我必须为巨大的结果集查询(超过 1Go 的小重量行)实现一个选择工厂。因此,我已经了解了游标,并按以下方式执行查询:

我创建一个光标:

DECLARE HashedCursorName CURSOR FOR SELECT * FROM BigResultSetQuery;
Run Code Online (Sandbox Code Playgroud)

我重复获取少量结果集:

FETCH 1000 FROM HashedCursorName;
Run Code Online (Sandbox Code Playgroud)

当结果集耗尽时,我关闭游标:

CLOSE HashedCursorName;
Run Code Online (Sandbox Code Playgroud)

我需要解决并发问题,我的意思是,许多用户必须能够同时使用 API 过程中存储的相同查询。当用户执行存储的查询时,他会收到一个新连接。我首先在 API 中修改了我的游标名称,因为我认为如果调用所有选择查询,StaticCursorName我会遇到两个用户试图创建相同游标或读取相同游标的问题。一切都按预期进行。

然后我尝试将光标名称更改为静态名称,它仍然有效。我能够同时运行多个相同的查询。然后我想知道,光标是否绑定到连接?,然后PostgreSQL是通过将游标分配给会话来解决并发的吗?

Dan*_*ité 5

是的,游标不在会话之间共享,并且它们的名称空间也是会话私有的。

此外,如果游标未通过该WITH HOLD子句声明为“可保留”,则它会在事务结束时自动关闭。

游标寿命和会话之间的关系在文档页中有详细说明CLOSE

当事务由 COMMIT 或 ROLLBACK 终止时,每个不可保持的打开游标都会隐式关闭。如果创建可保留游标的事务通过 ROLLBACK 中止,则可保留游标将隐式关闭。如果创建事务成功提交,则可保持游标将保持打开状态,直到执行显式 CLOSE 或客户端断开连接。