如何在 Postgres 中异步运行代码块(如作业)?
Posted
技术标签:
【中文标题】如何在 Postgres 中异步运行代码块(如作业)?【英文标题】:How to run block of code in Postgres asynchronously (like a job)? 【发布时间】:2021-07-01 15:28:55 【问题描述】:我们可以在当前会话之外执行一段代码吗?
换句话说,将执行委托给另一个工作线程,类似于 Oracle 中的 dbms_job.submit
。
我只找到了涉及 Cron 等外部工具的解决方案,但没有看到任何使用 PostgreSQL DBMS 本身的选项。
我想在不阻塞当前会话的情况下运行的简单长运行块示例:
DO
$do$
begin
FOR i IN 1..1000000
loop
// some long running inserts
insert into my_table(x) values (i);
commit;
end loop;
end $do$;
【问题讨论】:
你试过pgagent吗? pgadmin.org/docs/pgadmin4/5.0/pgagent_jobs.html @richyen 我不知道如何访问它。在 pgAdmin“帮助/快速搜索”中没有找到“pgAgent”。在 Application Stack Builder 中,我也没有看到安装“pgAgent”的选项。文档没有提供有关安装的足够信息。 您使用的是enterprisedb postgres,还是普通的社区postgres? 【参考方案1】:您应该看看这个新的 PostgreSQL 扩展 pg_dbms_job,它使用与 dbms_job.submit() 相同的过程实现了 Oracle DBMS_JOB 提供的所有功能。
【讨论】:
【参考方案2】:您一次只能在一个 PostgreSQL 数据库会话中运行一条语句。解决方案是启动第二个会话:然后一个会话可以执行脚本,您可以在另一个会话中同时执行其他工作。
【讨论】:
完全正确。但我想开始一个长时间运行的语句,关闭我的会话,然后返回并检查结果。作为奖励,它可以防止在工作过程中出现网络故障时连接丢失。 这是一个合理的要求。以nohup psql -f script.sql &
或您操作系统上的任何等效项开始您的脚本。以上是关于如何在 Postgres 中异步运行代码块(如作业)?的主要内容,如果未能解决你的问题,请参考以下文章