PostgreSQL 从主总体过程异步触发过程

问题描述 投票:0回答:1

我目前正在使用 AWS RDS 托管的 PostgreSQL 数据库构建管道。在我的管道中,我在 PostgreSQL 中有一个存储过程,它由 cron 触发并用于执行其他存储过程。程序摘要如下:

CREATE OR REPLACE PROCEDURE <postgres_schema>.main_procedure()
LANGUAGE plpgsql
AS $procedure$
begin
    
call <postgres_schema>.procedure_one();
call <postgres_schema>.procedure_two();
call <postgres_schema>.procedure_three();

END;
$procedure$
;

我想知道,有没有办法并行或至少异步执行这些过程中的最后两个(procedure_two 和 procedure_third)?我正在尝试设置一个进程,其中调用 main_procedure(),首先执行 procedure_one(),然后一旦该过程完成,同时调用 procedure_two() 和 procedure_ Three() 并在后台执行。

sql postgresql function stored-procedures amazon-rds
1个回答
0
投票

以下脚本演示了使用

dblink
执行异步/并发过程的方法:

CREATE EXTENSION IF NOT EXISTS dblink;

CREATE OR REPLACE PROCEDURE procedure_one(delay_in_seconds DOUBLE PRECISION) LANGUAGE plpgsql AS
$proc$
BEGIN
  PERFORM pg_sleep(delay_in_seconds);
END;
$proc$;

CREATE OR REPLACE PROCEDURE procedure_two(delay_in_seconds DOUBLE PRECISION) LANGUAGE plpgsql AS
$proc$
BEGIN
  PERFORM pg_sleep(delay_in_seconds);
END;
$proc$;

CREATE OR REPLACE PROCEDURE procedure_three(delay_in_seconds DOUBLE PRECISION) LANGUAGE plpgsql AS
$proc$
BEGIN
  PERFORM pg_sleep(delay_in_seconds);
END;
$proc$;

CREATE OR REPLACE PROCEDURE main_procedure () LANGUAGE plpgsql AS
$proc$
DECLARE
  connstr TEXT := 'hostaddr=127.0.0.1 port=5432 dbname=so_wip user=postgres';
BEGIN
  CALL procedure_one(5);
  PERFORM dblink_connect('con1', connstr);
  PERFORM dblink_connect('con2', connstr);
  PERFORM dblink_send_query('con1', 'CALL procedure_two(10);');
  PERFORM dblink_send_query('con2', 'CALL procedure_three(5);');
  PERFORM dblink_disconnect('con1');
  PERFORM dblink_disconnect('con2');
END;
$proc$;

CALL main_procedure();

通过在脚本运行时从单独的连接(或使用 pgAdmin 的仪表板)查询

pg_stat_activity
,可以看到这些过程确实是同时运行的。

© www.soinside.com 2019 - 2024. All rights reserved.