【问题标题】:Asynchronous query status functions only available in same session?异步查询状态功能仅在同一会话中可用?
【发布时间】:2018-10-04 21:27:33
【问题描述】:

我的目标是让 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 而言,不是这样吗?

我创建了一个解决方法,让长时间运行的进程将其状态发布到我可以查询的表中,但似乎提供的状态函数应该可以工作。

【问题讨论】:

    标签: sql postgresql asynchronous postgresql-9.5 dblink


    【解决方案1】:

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

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

    【讨论】:

    • 这提供了一些清晰度,希望文档能说明这一点,至少我所看到的并没有这么说。我仍然需要使用 dblink_send_query,因为我不能等待它完成。感谢您提供信息。
    • 您可以从文档中收集到它:连接将一直持续到关闭或数据库会话结束。 我猜没有人想到有人会假设一个dblink 连接可以在数据库会话之外重用...
    • 是的,谢谢,我之前确实看到过。问题是,他们所说的会话是什么意思。我可以实例化一个客户端,该客户端将调用调度异步查询的函数,然后关闭该客户端,但查询仍按预期运行,它没有关闭。那么,是客户端会话还是查询执行会话?它不能是客户端会话,因为我已关闭它,但查询仍在运行。在创建的连接中。再次感谢。
    • 在数据库行话中,会话从您连接到数据库的时间持续到您断开连接的时间。你所描述的只有当你没有以干净的方式关闭客户端时才会发生 - 然后后端不知道客户端已经消失了。
    • 那么必须发生的是: dblink_connect 和 dblink_send_query 的组合正在创建某种内部会话。因为我所描述的就是我所做的并且它有效,即我实例化一个客户端,触发命令然后关闭我的客户端,查询继续运行。这就是我期望异步查询调度工作的方式。
    【解决方案2】:

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

    此外,使用 SELECT 收集行的 CREATE TABLE 可以通过 dblink_send_query 发送,在完成之前,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');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 2014-11-10
      • 2023-02-17
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多