5

我有一个 postgresql-plsh 函数

    CREATE OR REPLACE FUNCTION MDN_REG_LOCATE(MDN VARCHAR(50), CALLID VARCHAR(50)) RETURN AS '
    #!/bin/sh
    /home/infoobjects/Projects/java/execute.sh $1 $2 &
logger -t "data" "$1$2"
    ' LANGUAGE plsh;

和 execute.sh 调用是一个需要 3 分钟才能执行的 java 进程(方法)。我已经通过在脚本末尾附加 & 使脚本异步(execute.sh)我的问题是 postgresql 函数仍然等待结果的到来并且不以异步方式运行,尽管 shell 脚本的行为是异步的,因为上面的记录器函数在调用 MDN_REG_LOCATE() 后会登录,但这个 postgresql 函数(MDN_REG_LOCATE)仍然等待 3 分钟的完整过程结束,我不知道我缺少什么,请帮助我。

感谢进阶。

4

1 回答 1

3

仅仅后台处理一个进程是不够的;它仍然附加到其父进程。看到这个答案

重新编写记录器程序以保持与任务所在的数据库的持久连接可能会好得多LISTEN。您的客户端(或触发器,或通常会调用您的 PL/Sh 函数的任何东西)发送NOTIFY带有参数的 a 作为有效负载,或者(对于较旧的 Pg 版本)INSERT将 sa 行发送到队列表中,然后发送 aNOTIFY告诉监听客户端查看在队列表。

然后,监听客户端可以运行后台进程,而不必担心会占用数据库。最重要的是,它NOTIFY是事务性的;它仅在发送它的事务提交时交付,在它提交时。

于 2012-10-11T12:19:21.513 回答