异步查询状态功能仅在同一会话中可用?

Asynchronous query status functions only available in same session?

我的目标是使用以下机制让 Web 服务触发异步查询:

select dblink_connect('asyncconnect', 'host=localhost port=5432 dbname=mydb user=theking password=pass');  
select dblink_send_query('asyncconnect', 'perform pg_sleep(60)); --represents som elong running query/function

在启动该进程后,我想稍后回来检查它的进度,在 新客户端实例 中,使用以下调用:

SELECT * from dblink_is_busy('asyncconnect');

但是,这不起作用,相反我收到错误消息:

ERROR: connection "asyncconnect" not available.

尽管初始分派的异步查询仍然如此 运行。

另外,如果我尝试这个查询:

select * from dblink_get_connections()

无returns。

这可以通过 运行 使用两个不同的 PostgreSQL 客户端的上述场景重新创建:我使用 dbeaver 连接和分派第一个工作查询,并使用 sqlworkbench 尝试获取查询状态。两者显然都连接到同一服务器和数据库。

现在,如果我在一个客户端中执行所有操作,那么它会按预期工作。

但是,异步处理的本质是您启动某些东西,然后稍后返回并检查它的状态或结果,而不管会话如何。

PostgreSQL 不也是这样吗?

我已经创建了一个变通方法,方法是让长 运行 处理 post 其状态为 table 然后我可以查询,但似乎提供的状态功能应该有效。

dblink 连接仅在创建它的数据库会话中可用。

所以是的,您将不得不使用不同的技术,就像您在解决方法中所做的那样。在那种情况下,您根本不需要 dblink。它只是不是您想要的工具。

您可以使用 dbink 发送一个异步查询,它将在 dblink_disconnect 成功断开连接后持续存在,但前提是它没有标记为 VOLATILE,如果它是一个函数调用。

此外,使用 SELECT 收集行的 CREATE TABLE 可以用 dblink_send_query 发送,并且在完成之前,dblink_disconnect 不会中断进程,并且在父会话中断开连接也不会中断。然后,稍后另一个会话可以等待并读取创建的 table.

示例:

set search_path = hdb ;

select dblink_connect('connection', 'dbname=database') ;

select dblink_send_query ( '_hdb' , 'create table ____ as select * from ____ JOIN _______ JOIN etc ;' ) ;

select dblink_disconnect('_hdb');