0

私はPostgreSQLサーバーを持っており、テーブルで更新が発生するたびにコードを実行する必要があります。PostgreSQLトリガー(PL / javaを使用)を使用すると、静的javaメソッドを呼び出すことができます。実行する必要のあるメソッドは、更新内容に関する情報を使用して外部サーバーに対してRPCを実行します。

私が理解できなかったのは、呼び出し間で持続するグローバルリソース(この場合は外部サーバーとのネットワーク接続)を作成する方法です。

1つの方法は、おそらくグローバルリソースの静的変数を作成することです。トリガーメソッドが最初に呼び出されたときに、それらの変数を初期化します。以降の呼び出しでは、それを使用してください。これは機能しますか、他に方法はありますか?

私が気に入っていたのは、トリガーに実装できる一般的なトリガーインターフェイスです。

4

2 に答える 2

3

たとえそれを行ったとしても、それは特定のセッションに対してのみ「グローバル」であり、多くのセッションにまたがることはありません。

しかし、私が見ているように、そのアプローチは間違っているので、その点は議論の余地があります。

外部システムに接続するトリガーを追加する代わりに、次のことを行います。

  1. NOTIFYを使用して変更を通知するトリガーを作成する
  2. 通知をリッスンし、リモート ジョブを実行するアプリケーションを追加します。
于 2011-12-23T14:23:58.923 に答える
0

depesz の回答とインターネットでの検索に基づいて、これが私の状況に対する最良の解決策です。

クライアントが発行する方法がありますLISTEN xyz。サーバーへのステートメント。それからNOTIFY xyz; ステートメントはサーバーで発行でき、クライアントに通知されます。xyz何が起こったかを特定するために使用されます。このNOTIFYステートメントでは、「ペイロード」を一緒に送信することもできます (現在の最新バージョンである PostgreSQL 9+ でのみサポートされています)。

適切な実装は、テーブルへの更新に基づくトリガーを関連付けることです。そのトリガーNOTIFYはクライアントにステートメントを発行し、ペイロードには更新された行データが含まれます。

この実装には欠点が 1 つあります。それは、JDBC ドライバー (PostgreSQL サーバーに接続するための Java インターフェイス) が真の非同期動作をサポートしていないことです。リスナーは、バックエンドに接続するためにダミー クエリを発行する必要があります (更新 - ダミー クエリは必要ありません: http://goo.gl/VbFQg。まだポーリングしています)。そうして初めて、保留中のすべての通知がクライアントに配信されます。また、SQL に対する LISTEN/NOTIFY 拡張機能は PostgreSQL のみに固有のものであり、SQL 標準の一部ではないことに注意してください。

参考文献: PostgreSQLのNOTIFY ドキュメント、listen/notify の JDBC ドキュメント ページ

于 2011-12-24T10:02:24.980 に答える