データベースからイベントを取得する
-
03-07-2019 - |
質問
データベースと、CRUD操作以外でデータベースが提供するものについてはあまり詳しくありません。
私の研究により、トリガーに至りました。基本的に、トリガーはこのタイプの機能を提供するように見えます:
(ウィキペディアから)
通常、トリガーを「起動」させる3つのトリガーイベントがあります:
- INSERTイベント(新しいレコードがデータベースに挿入されるとき)。
- UPDATEイベント(レコードの変更中)。
- DELETEイベント(レコードの削除中)。
私の質問は、ある種のトリガーセマンティクスを使用してレコードが更新/削除/挿入されたときに、データベースからJava(できれば変更されたデータを含む)で通知を受ける方法はありますか?
この問題の代替ソリューションは何ですか?データベースイベントをリッスンするにはどうすればよいですか?
これを行う主な理由は、次のようなシナリオです:
5つのクライアントアプリケーションがすべて異なるプロセスに存在し、異なるPC全体に存在しています。それらはすべて共通のデータベース(この場合はPostgres)を共有します。
あるクライアントが5つのクライアントすべてが「興味がある」というDBのレコードを変更したとしましょう。 in。クライアントに「通知」する方法を考えています。ある間隔でデータを照会する代わりに、変更の(できれば影響を受けるデータを添付して)
解決
Oracleを使用すると、テーブルにトリガーを設定し、トリガーにJMSメッセージを送信させることができます。 Oracleには2つの異なるJMS実装があります。その後、JDBCドライバーを使用してメッセージを「リッスン」するプロセスを作成できます。この方法を使用して、アプリケーションとポーリングの間に変更をプッシュしました。 Javaデータベース(H2)を使用している場合、追加のオプションがあります。現在のアプリケーション(SIEM)では、H2にJMXを使用して変更イベントを公開するトリガーがあります。
他のヒント
データベース(データを含む)とそのデータのイベントを混同しないでください。
トリガーは1つの方法ですが、通常はアプリケーションに永続層があります。このレイヤーは、特定の事態が発生したときにイベントを起動することを選択できます-JMSトピックなど。
「イベント」ではなく、リレーショナルアイテムを操作するため、トリガーは最後の溝です。データ上。 (たとえば、" update"は、実際には" company changed legal name"イベントにマップできます)dbに依存している場合、挿入&をマップする必要があります。現実のイベントに更新して更新します....あなたはすでに知っていました!
これらの通知の上に他のものを重ねて(イベントストリーム処理など)他の人が興味を持っているイベントを見つけることができます。
ジェームズ
うーん。したがって、あなたはPostgreSQLを使用していて、「聞き」たいと思います。イベントの場合、「通知」されるいつ発生しますか?
http://www.postgresql.org/docs/8.3/ static / sql-listen.html http://www.postgresql.org/docs/8.3/static/sql -notify.html
これがお役に立てば幸いです!
データベースから外部プロセスを呼び出すことは、ベンダー固有です。
頭のてっぺんから:
-
SQLServerからCLRプログラムを呼び出すことができます トリガー、
-
postgresqlは任意のCを呼び出すことができます 動的にロードされる関数、
-
MySQLは任意のC関数を呼び出すことができますが、 ただし、コンパイルする必要があります。
-
設定されている場合、Sybaseはシステムコールを実行できます そうするまで。
最も簡単なことは、挿入/更新/削除トリガーでログテーブルにエントリを作成し、Javaプログラムにそのテーブルを監視させることです。ログテーブルに適切な列は、EVENT_CODE、LOG_DATETIME、LOG_MSGなどです。
非常に高いパフォーマンスが必要な場合、または100Kのレコードを処理する必要がある場合を除き、おそらくそれで十分です。
あなたは2つのことを混乱させていると思います。どちらも高度なデータベースベンダー固有です。
最初に「トリガー」を呼び出します。トリガーがこれとは異なると考える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通知サービスは、これの別の実装でもあります。
データベースにクライアントプログラムに通知する理由を本当によく知っている方がいいと思う限り、それ以外の場合はサーバー側トリガーを使用する必要があります。
何を求めているかは、使用しているデータベースと、データベースとの通信に使用しているフレームワークの両方に依存します。
永続化レイヤーとしてHibernateのようなものを使用している場合、データベースに出入りするレコードを監視するために使用できるリスナーとインターセプターのセットがあります。
ここでは、使用しているデータベースに応じていくつかの異なる手法があります。 1つのアイデアは、データベースをポーリングすることです(これは避けようとしているはずです)。基本的に、頻繁に変更を確認できます。
別の解決策(SQL Server 2005を使用している場合)は、Notification Servicesを使用することです。ただし、この技術はSQL 2008で置き換えられていると考えられます(純粋な置き換えはまだ見ていませんが、Microsoftはそれについて公に話しました) 。
Oracleを使用している場合は、この前の投稿をご覧ください。
これは通常、標準のクライアント/サーバーアプリケーションの目的です。すべての挿入/更新/削除がサーバーアプリケーションを通過し、データベースが変更されると、クライアントアプリケーションはどのような変更が行われたかを簡単に見つけることができます。
postgresqlを使用している場合、JDBCクライアントから通知をリッスンする機能があります。 。
タイムスタンプ列を使用することをお勧めします。最後に更新され、場合によってはユーザーがレコードを更新し、クライアントにローカルレコードのタイムスタンプを永続的なレコードのタイムスタンプと照合させます。
コールバック/トリガー機能を追加する複雑さは、データベースバックエンドと使用されるクライアントライブラリ(たとえば、ADOと共に使用されるSQL Server 2005で提供される通知サービスなど)でサポートされていない限り、価値がありません。 NET。