我目前正在使用 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() 并在后台执行。
以下脚本演示了使用
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
,可以看到这些过程确实是同时运行的。