2009-11-20 10 views
6

データベースサーバのすべてのクライアントを同期させておくのに最適な方法は何ですか?すべてのクライアント間でのデータベースデータのリアルタイム同期

シナリオには、データベースサーバーと、それに接続してデータを表示および変更する動的な数のクライアントが含まれます。

データが追加、削除、または更新された場合、リアルタイムですべてのクライアントに変更を見せてもらう必要があります。数百万行のテーブルの変更を継続的にポーリングすることにより、

私はFirebirdデータベースサーバーを使用していますが、私はその仕事に最適なテクノロジを採用したいので、この種のシナリオには既存のフレームワークがあるかどうか、それは使用して何が含まれていますか?

+0

クライアントが、何らかの形で「プッシュ」されている(より多くの場合は通知)、むしろ(より簡単には...)、期待されていますか?リフレッシュを行って結果セットを移動し、データベースを最新のものにすることができますか? – mjv

+0

私のフロントエンドはWPFなので、データバインディングのシナリオではもっと考えています。 – luvieere

答えて

5

Firebirdには、EVENTという機能があり、クライアントにデータベースの変更を通知する機能があります。この考え方は、テーブル内のデータが変更されると、トリガーがイベントをポストすることです。 Firebirdは、イベントに興味を持ったすべてのクライアントに名前で通知します。通知されると、各クライアントは、データベースに照会することによって、自身のデータを更新する責任があります。

クライアントは、新しい値または古い値に関するイベントから情報を取得できません。これは、トランザクション分離を使用してこれを解決する方法がないため、設計によるものです。ワイルドカードを使ってイベントを登録することもできません。したがって、サーバーツークライアントの通知をかなり広く設計し、クライアントが更新して正確に何が変更されたのかを確認する必要があります。

参照http://www.firebirdsql.org/doc/whitepapers/events_paper.pdf

あなたが使っているものをクライアントプラットフォームや言語に言及していないので、私はあなたが使用する特定のAPIについて助言することはできません。私は、あなたが使用している言語に基づいて、インスタンス "firebird event java"または "firebird event php"または同様のものをGoogleに提案します。


あなたがWPFを使用しているコメントで言っているので、ここではイベントの通知のために登録するいくつかの.NETアプリケーションコードのコードサンプルへのリンクです:

http://www.firebirdsql.org/index.php?op=devel&sub=netprovider&id=examples#3


コメント:はい、Firebirdのイベントメカニズムは、情報を運ぶ機能が限られています。これが必要なのは、持ち運ぶ情報が取り消されたりロールバックされたりする可能性があるからです。たとえば、トリガがイベントをポストしたが、そのトリガを発生させた操作が制約に違反して、その操作はキャンセルされますが、イベントはキャンセルされません。だからイベントは興味のあるものが起こったかもしれない一種の「ヒント」にすぎない。他のクライアントはその時点でデータをリフレッシュする必要がありますが、検索対象はわかりません。これは少なくともポーリングより優れています。

基本的には、公開/購読メカニズム - メッセージキューを説明しています。私は、メッセージキューを実装するためにRDBMSを使用するかどうかはわかりません。それはできますが、あなたは基本的に車輪を再発明しています。

  • Microsoft MSMQ
  • RabbitMQ(無料のオープンソース)
  • Apache ActiveMQする(Windows ProfessionalおよびServerのエディションの一部のようです):ここでは

    はよく考えられているいくつかのメッセージキュー製品であります(無料のオープンソース)
  • IBM WebSphere MQ

これは、あるクライアントが他の人が知る必要のあるようにデータを変更すると、そのクライアントがメッセージをメッセージキューに投稿する必要があることを意味します。興味のあるメッセージを消費者クライアントが見ると、彼らはデータのコピーをリフレッシュすることを知っています。

+0

ありがとうございました、私はイベントを認識していました。問題は、行が変更されたことを知ることで、イベントを受信するたびにクライアントデータとサーバーデータを比較することを避けることができます。おそらく、イベントを受け取ったときに照会できる個別テーブルに最新の変更を書き込むストアドプロシージャを挿入/更新/削除する必要があると思いますか? – luvieere

1

SQL Server 2005以降では、通知ベースのデータソースのキャッシュの有効期限をサポートしています。

関連する問題