私はデータベースと、それらがCRUD操作以外で提供するものにあまり精通していません。
私の調査により、トリガーが発生しました。基本的に、トリガーはこのタイプの機能を提供するように見えます。
( ウィキペディア から)
通常、トリガーを「起動」させる3つのトリガーイベントがあります。
- INSERTイベント(新しいレコードがデータベースに挿入されているため)。
- UPDATEイベント(レコードが変更されているため)。
- DELETEイベント(レコードが削除されているため)。
私の質問は、ある種のトリガーセマンティクスを使用してレコードが更新/削除/挿入されたときにデータベースからJava(できれば変更されたデータを含む)で通知される方法はありますか?
この問題に対するいくつかの代替解決策は何でしょうか?データベースイベントをリッスンするにはどうすればよいですか?
これを実行したい主な理由は次のようなシナリオです:
私は5つのクライアントアプリケーションをすべて異なるプロセスに持っている/異なるPCに存在しています。それらはすべて共通のデータベース(この場合はPostgres)を共有します。
1つのクライアントがDB内の、5つのクライアントすべてが「関心を持っている」レコードを変更したとします。私は、クライアントに変更を(できれば影響を受けるデータを添付して)「通知」する方法を考えようとしています。彼らはある間隔でデータを照会します。
Oracleを使用すると、テーブルにトリガーを設定してから、トリガーにJMSメッセージを送信させることができます。 Oracleには2つの異なるJMS実装があります。次に、JDBCドライバーを使用してメッセージを「リッスン」するプロセスを作成できます。私はこの方法を使用して、変更をアプリケーションとポーリングにプッシュしました。 Javaデータベース(H2)を使用している場合は、追加のオプションがあります。現在のアプリケーション(SIEM)には、JMXを使用して変更イベントを公開するトリガーがH2にあります。
データベース(データを含む)とそのデータのイベントを混同しないでください。
トリガーは1つの方法ですが、通常、アプリケーションには永続層があります。このレイヤーは、JMSトピックなど、特定のことが発生したときにイベントを発生させることを選択できます。
データの「イベント」ではなく、リレーショナルアイテムを操作しているため、トリガーは最後の手段です。 (たとえば、「更新」は、実際には「会社の正式名称変更」イベントにマップできます)データベースに依存している場合は、挿入と更新を実際のイベントにマップし直す必要があります。あなたはすでに知っていました!
次に、これらの通知の上に他のもの(イベントストリーム処理など)を重ねて、他の人が興味を持っているイベントを見つけることができます。
ジェームズ
うーん。それで、PostgreSQLを使用していて、イベントを「リッスン」し、イベントが発生したときに「通知」したいですか?
http://www.postgresql.org/docs/8.3/static/sql-listen.htmlhttp://www.postgresql.org/docs/8.3/static/sql- notify.html
お役に立てれば!
データベースからの外部プロセスの呼び出しは、ベンダー固有です。
頭のてっぺんから:
SQLServerは、トリガーからCLRプログラムを呼び出すことができます。
postgresqlは、動的にロードされた任意のC関数を呼び出すことができます。
MySQLは任意のC関数を呼び出すことができますが、コンパイルする必要があります。
Sybaseは、システムコールを実行するように設定されている場合、システムコールを実行できます。
あなたは2つのことを混同していると思います。どちらも非常にdbベンダー固有です。
最初に「トリガー」と呼びます。トリガーがこれとは異なると考えているDBベンダーが少なくとも1つあると確信していますが、我慢してください。トリガーは、テーブルにアタッチできるサーバー側のコードです。たとえば、テーブルXの更新ごとにPSQLストアドプロシージャを実行できます。一部のデータベースでは、これらを実際のプログラミング言語で記述できますが、SQLのバリアントでのみ記述できるデータベースもあります。トリガーは通常、適度に高速でスケーラブルです。
もう1つは「イベント」と呼びます。これらはデータベースで起動するトリガーであり、クライアントプログラムでイベントハンドラーを定義できます。 IE、クライアントデータベースに更新があるときはいつでも、プログラムでupdateClientsListを起動します。たとえば、pythonとfirebirdを使用する場合は、 http://www.firebirdsql.org/devel/python/docs/3.3.0/beyond-python-db-api.html)を参照してください。 #database-event-notification
モニターを使用するという以前の提案は、他のデータベースを使用してこれを実装するのと同等の方法だと思います。多分オラクル?別の回答で言及されているMSSQL通知サービスも、これの別の実装です。
データベースがクライアントプログラムに通知する理由を本当に知っている方がよいと言っても過言ではありません。そうでない場合は、サーバー側のトリガーを使用する必要があります。
最も簡単な方法は、挿入/更新/削除トリガーでログテーブルにエントリを作成し、Javaプログラムでそのテーブルを監視することです。ログテーブルに適切な列を含めると、 EVENT_CODE、LOG_DATETIME、LOG_MSGなどになります。
非常に高いパフォーマンスが必要な場合や、100Kのレコードを処理する必要がある場合を除いて、おそらくそれで十分です。
Postgresqlを使用している場合は、JDBCクライアントから notifications をリッスンする機能があります。
何を求めているかは、使用しているデータベースと、データベースとの通信に使用しているフレームワークの両方に完全に依存します。
永続層としてHibernateのようなものを使用している場合、データベースに出入りするレコードを監視するために使用できるリスナーとインターセプターのセットがあります。
使用しているデータベースに応じて、ここにはいくつかの異なる手法があります。 1つのアイデアは、データベースをポーリングすることです(これは、回避しようとしていると確信しています)。基本的に、変更を頻繁にチェックできます。
別の解決策(SQL Server 2005を使用している場合)は、Notification Servicesを使用することですが、このテクノロジはSQL 2008で置き換えられると思われます(完全な置き換えはまだ確認されていませんが、Microsoftが公表しています)。
これは通常、標準のクライアント/サーバーアプリケーションの目的です。すべての挿入/更新/削除がサーバーアプリケーションを経由し、サーバーアプリケーションがデータベースを変更する場合、クライアントアプリケーションはどのような変更が行われたかをはるかに簡単に見つけることができます。
Oracleを使用している場合は、これを確認してください 前の投稿 。