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 関数がまだ結果が来るのを待っており、非同期的に動作しないことです。関数は MDN_REG_LOCATE() への呼び出しの直後にログアップしますが、それでもこの postgresql 関数 (MDN_REG_LOCATE) は 3 分間の完全なプロセスを待機します。

前もって感謝します。

4

1 に答える 1

3

プロセスを単にバックグラウンド化するだけでは十分ではありません。親プロセスに接続されたままです。この回答を参照してください。

ロガープログラムを作り直して、タスク用のデータベースへの永続的な接続を維持する方がはるかに優れている可能性があります。LISTENクライアント (またはトリガー、または通常 PL/Sh 関数を呼び出すもの)NOTIFYはパラメーターを含む をペイロードとして送信するか、(古い Pg バージョンの場合)INSERT行をキュー テーブルに送信しNOTIFY、リッスンしているクライアントに確認するように を送信します。キューテーブルで。

リッスンしているクライアントは、データベースを保持することを心配することなく、バックグラウンド プロセスを実行できます。何よりも、NOTIFYはトランザクショナルです。それを送信したトランザクションがコミットしたときにのみ配信されます。

于 2012-10-11T12:19:21.513 に答える