2012-10-11 45 views
2

的執行我有一個PostgreSQL-PLSH功能PostgreSQL的PL/sh的異步外部過程

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呼叫是一個Java過程(方法),它需要3分鐘來執行。我使腳本異步,在腳本末尾追加&(execute.sh) 我的問題是postgresql函數仍然等待結果發生並且不以異步方式進行操作,儘管shell腳本的行爲異步,因爲記錄器處於上面的函數在jst調用MDN_REG_LOCATE()後記錄下來,但這個postgresql函數(MDN_REG_LOCATE)仍然等待3分鐘的完成過程結束,我不知道我缺少什麼,請幫助我。

Thanks In Adv。

+0

首先,PL/sh通常是錯誤的答案。用'LISTEN''和一個觸發器來發送'NOTIFY'時,你可能會更好。然後,客戶端可以使用'NOTIFY'中發送的參數或從隊列表中獲取的參數執行任務。 –

回答

1

簡單地背景一個過程是不夠的;它仍然依附於其父進程。見this answer

你很可能是很多更好的是改造你的記錄器程序,以保持與數據庫的持久連接,其中任務爲LISTEN。你的客戶端(或觸發器,或任何通常會調用你的PL/Sh功能的東西)發送一個NOTIFY作爲有效負載,或(對於較老的Pg版本)INSERT sa行進入隊列表,然後發送一個NOTIFY告訴聽客戶端查看隊列表。

偵聽客戶端可以運行後臺進程,不用擔心阻止數據庫。最重要的是,NOTIFY是交易性的;只有在發送它的事務在提交時才提交。