17

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

答えて

16

クエリ通知はService Brokerサービスにプッシュされ、アプリケーションには直接送られません。どのように動作するかについては、The Mysterious Notificationを参照してください。あなたのアプリケーションは、WAITFOR(RECEIVE)ステートメントをデータベースに掲載して通知を待っています。これは、100のクライアントのそれぞれが1つのSQL Serverワーカースレッドを占有していることを意味します(制限されています、max worker threadsオプションを参照)。私は+ 1000クライアント(最大ワーカースレッドオプションをバンプアップした後)の生産でこれを見てきましたが、私はに対してに対してアドバイスします。

私は、のサービスモニタリングをSqlDependency/QueryNotificationsを使用して行うことをお勧めします。このサービスは、WCFを使用して、実行中のすべてのアプリケーションに通知をプッシュします。一般的な変更(the table Foo was changed)を購読し、特定のもの(the row x in table Foo was inserted)には加入しません。

一般的に、SqlDependency/Query通知は、データが変更されたことを通知するだけですが、新しいデータをにプッシュしません。アプリケーションは、一度通知されると、クエリを再度実行してローカルデータセットを更新する必要があります。

3

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

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); 

あなたはDELETEとINSERT避け、単にUPDATEを監視することができます:これは使用例です。お役に立てれば。

関連する問題