我的目标是使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');
但是,这不起作用,相反,我收到错误消息:
错误:连接“ asyncconnect”不可用。
尽管初始分配的异步查询仍在运行。
此外,如果我尝试以下查询:
select * from dblink_get_connections()
一无所获。
这可以通过在两个不同的PostgreSQL客户端上运行上述场景来重新创建:我使用dbeaver连接并调度第一个辅助查询,而使用sqlworkbench尝试获取查询状态。两者显然都连接到同一服务器和数据库。
现在,如果我在一个客户端中执行所有操作,那么它将按预期工作。
但是,异步处理的本质是您先触发一些内容,然后再回来检查其状态或结果,而与会话无关。
就PostgreSQL而言不是这样吗?
我通过长时间运行的过程将其状态发布到可以查询的表中来创建了一种解决方法,但是看来提供的状态功能应该可以工作。
答案 0 :(得分:0)
dblink连接仅在创建它的数据库会话中可用。
是的,您将不得不使用另一种技术,就像您在解决方法中一样。在这种情况下,您根本不需要dblink。它只是不是您想要的工具。
答案 1 :(得分:0)
您可以发送带有dbink的异步查询,该查询将在dblink_disconnect成功断开连接后继续存在,但是只有在未将其标记为VOLATILE(如果是函数调用)的情况下。
此外,可以使用dblink_send_query发送使用SELECT收集行的CREATE TABLE,并且在完成之前,dblink_disconnect不会中断该过程,并且在父会话中断开连接也不会中断。然后,稍后另一个会话可以等待并读取创建的表。
示例:
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');