アプリケーションは、データベースからできる限り新しいデータを更新する必要があります。そのような場合、タイマーに基づいてデータベースを要求(ポーリング)する以外に、データを取得する他の方法はありますか?
MS SQL Server 2008(および.NETアプリケーション+ Entity Framework)を使用していますが、他の種類のデータベースについても知りたいです。
Service Broker SQL Server 2005+の場合、これを行うことができます。
他のRDBMSはわかりません
Oracleでは、組み込み DBMS_ALERTパッケージ を使用してこれを容易にすることができます。
DBMS_ALERTは、データベースイベント(アラート)の非同期通知をサポートしています。このパッケージとデータベーストリガーを適切に使用することで、アプリケーションは、データベース内の重要な値が変更されたときに通知を受け取ることができます。
グラフィックツールがデータベーステーブルの一部のデータのグラフを表示しているとします。グラフィックスツールは、データを読み取ってグラフ化した後、読み取ったばかりのデータをカバーするデータベースアラート(WAITONE)を待つことができます。他のユーザーがデータを変更すると、ツールは自動的に起動します。必要なことは、トリガーがデータベーステーブルに配置され、トリガーが起動されるたびにシグナル(SIGNAL)を実行することです。
PostgreSQLのLISTEN/NOTIFY
http://www.postgresql.org/docs/current/static/sql-notify.html
データベースで...
NOTIFY static_channel_name, 'static-message';
または関数/トリガーで:
perform pg_notify('dynamic-channel-name', 'dynamic-message');
データベースクライアント:
LISTEN some_channel_name; --note the lack of quotes
LISTENクライアントは、PostgreSQLプロセスID、チャネル名、およびメッセージ値を受け取ります。
PostgreSQLの標準JDBCドライバーは通知を好みませんが、この目的で https://github.com/impossibl/pgjdbc-ng ドライバーを使用できます
特定のデータベースベンダーは、アプリが簡単にサブスクライブできる統合メッセージバスも提供しています。
別の方法としては、最初に Tibco/RV のようなメッセージバスを介してデータベースにデータをルーティングし、DBに入るストリームとアプリケーションに行くストリームで単純に「分岐」します。または、アプリとDBの間で Coherence のようなキャッシュレイヤーを使用します。
別のOracleソリューション:ODP.Net(dotnetのOracleデータプロバイダー)とともにOracleの データベース変更通知 機能を利用する、Microsoftのdotnetフレームワークを使用したアプリケーションを開発しました。これを使用して、データベースは実際に新しいデータが到着したときにdotnetアプリケーションに通知し、継続的なポーリングを回避できるようにします。上記で参照したリンクは、まさにそのためのOracleチュートリアルです。これがお役に立てば幸いです。
他のRDBMSについては知らない。
アプリケーションの1つ(Chromeからアクセスされ、Chromeのみ)に対して、MySQLを sys_exec UDF で使用しています。基本的に、なぜChrome-WebSocketサポートのためか。
重要な更新/挿入/削除が発生すると、特定のトリガーに埋め込まれた新しく追加されたsys_exec機能を通じて外部プログラムが呼び出されます。その時点で、すべてがリアルタイムで発生するため、ポーリングや複数のクエリを必要とせずに、接続されているすべてのクライアントにメッセージをリレーするために必要なものがすべて揃っています。
Oracle GoldenGateとJava Persistence API(JPA))の組み合わせを使用して、これをOracleデータベースだけでなく、DB2、Sybase、Microsoft SQL Server、MySQL、Teradataなどでも使用しています。ここで説明します: http://docs.Oracle.com/middleware/1212/coherence/COHIG/golden_g.htm
GoldenGateが行うことは、データベーストランザクションログをフィルター可能なイベントストリームに変換し、ネットワーク全体のどこでも使用できるようにすることです。これを使用して、関連するトランザクションをキャッシュの更新またはキャッシュの無効化に変換します。どちらもアプリケーションレベルのイベントをトリガーできます。データをデスクトップまたはHTML5 WebSocketアプリケーションにプッシュします。
(完全に開示するために、私はGoldenGateを使用している製品の1つでOracleで働いています。)