web-dev-qa-db-ja.com

データベース(SQL)に更新を通知するか、クライアントアプリケーションに更新をプッシュしたい

私はVB.net 2010SQL 2008でこのアプリケーションを開発していました。
私はクライアントにデータベースの更新を通知することを望み、アプリケーションはタイマーを使用して指定された分の変更をデータベースでチェックするために使用されましたが、これは実際には効率的ではありません。私はquery notificationsqldependencyservice brokerについて読みましたが、100個のクライアントがあり、クエリ通知を使用してプッシュ通知を送信している場合、効率的でない可能性があることを読みました私のアプリケーション。
誰かが私が何をすべきか、そしてどのようにそれを行うことができるかを手伝ってくれるでしょうか(例が利用可能であれば本当に役に立ちます)。前もって感謝します!

21
mike.dev

クエリ通知は、アプリケーションに直接ではなく、Service Brokerサービスにプッシュします。それがどのように機能するかを理解するには、 The Mysterious Notification を参照してください。アプリケーションは、データベースへの WAITFOR(RECEIVE) ステートメントの投稿によって通知を待機しています。これは、100個のクライアントのそれぞれが1つのSQL Serverワーカースレッドを使用していることを意味します(制限されています。 max worker threads オプション)。これが+1000クライアントで稼働しているのを見てきました(最大ワーカースレッドオプションを増やした後)が、againstにアドバイスすることをお勧めします。

私の推奨は、SqlDependency/QueryNotificationsを使用してoneサービスの変更を監視することです。このサービスは、たとえばWCFを使用して、実行中のすべてのアプリに通知をプッシュします。一般的な変更をサブスクライブします(the table Foo was changed)、特定のものではない(the row x in table Foo was inserted)。

原則として、SqlDependency/Query Notificationsはデータが変更されたことのみを通知できますが、newデータをプッシュしません。通知を受けたら、アプリケーションはクエリを再度実行してローカルデータセットを更新する必要があります。

21
Remus Rusanu

SqlDependency クラスを使用する場合は注意してください。 problems があり、メモリリークが発生します。 Hovewerでは、SqlDependencyクラスのオープンソースの実現を使用できます- SqlDependencyEx 。データベーストリガーとネイティブのService Broker通知を使用して、テーブルの変更に関するイベントを受信します。これは使用例です:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

SqlDependecyExを使用すると、UPDATEだけを監視して、DELETEとINSERTを回避できます。お役に立てれば。

3
dyatchenko

データベースを手動で更新せず、すべてのデータ操作がアプリケーションで行われる場合、データベーステクノロジーに依存していて他のデータベースへの移動が困難になる場合に備えて、dbではなくアプリケーションサービスレイヤーまたはビジネスレイヤーで変更を検出する必要があります。一方、dbへの手動更新またはdbへの依存が重要でない場合は、CDC(データキャプチャの収集)を使用して、サービスブローカーに変更をプッシュし、アプリケーションブローカーからアプリケーションポップの変更を双方向のhttp通信技術によってクライアントに送信できます。 SignalRと同じ。

0
reza taroosheh