我的目标是使用以下机制让 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.
尽管来自初始分派(dispatch)的异步查询仍在运行。
另外,如果我尝试这个查询:
select * from dblink_get_connections()
没有返回。
这可以通过使用两个不同的 PostgreSQL 客户端运行上述场景来重新创建:我使用 dbeaver 连接和分派(dispatch)第一个工作查询,并使用 sqlworkbench 尝试获取查询状态。两者显然都连接到同一服务器和数据库。
现在,如果我在一个客户端中执行所有操作,那么它会按预期工作。
但是,异步处理的本质是您启动某些东西,然后稍后返回并检查它的状态或结果,而不管 session 如何。
就 PostgreSQL 而言,情况不是这样吗?
我已经创建了一个解决方法,让长时间运行的进程将其状态发布到一个表中,然后我可以查询,但似乎提供的状态函数应该可以工作。
最佳答案
dblink 连接仅在创建它的数据库 session 中可用。
所以是的,您将不得不使用不同的技术,就像您在解决方法中所做的那样。在那种情况下,您根本不需要 dblink。它只是不是您想要的工具。
关于sql - 异步查询状态功能仅在同一 session 中可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52655389/