7

私はいくつかの調査を行っており、このシステムの配管のほとんどを見ることができますが、たとえば、テーブル内のデータが変更されたときに、SQLサーバーがリスナー(アプリケーション)にメッセージを返すタイミングをどのように認識しているかわかりません。まず、迷子になるまでの理解内容を説明します。

1)データベースでService Brokerを有効にし、いくつかの権限を設定する必要があります。

2)データベーススキーマをデプロイする必要があります。

3)aspnet_regsql.exeを使用して、データベースとデータをキャッシュする必要のあるテーブルのSQLキャッシュ依存関係を有効にします(この手順では、変更を追跡するテーブルと、変更をキャプチャしてそのテーブルの値をインクリメントするテーブルのトリガーを作成します)。

4).netアプリケーションでSQLキャッシュの依存関係を設定します。たとえば、Webアプリでは、ポーリング時間、接続文字列などの構成値を追加する必要があります。global.asax.csで依存関係を開始/停止し、キャッシュにアイテムを追加するときにSQLキャッシュの依存関係を追加します。

4a)依存関係を開始するときに発生することの一部は、インフラストラクチャがキュー、サービス、およびその後の通信とクリーンアップのためのsproc用にセットアップされることです。SQL Query Profilerを使用すると、アプリケーションがSQLサーバーからメッセージを受信するために、接続が確立され、通信チャネルがサービスに設定されていることを確認できます。

5)ここで私は混乱します。この時点で、基になるテーブルへのSQLキャッシュの依存関係を参照して、アプリケーションキャッシュにアイテムをキャッシュしました。これにより、行が変更された場合にアプリが変更を受け取ることができます。その行で手動で更新を実行すると、トリガーがヒットし、追跡テーブルの値が1ずつ増加していることがわかります。ただし、アプリケーションに戻る通信は表示されず、SQLクエリプロファイラーにも何も表示されません。キャッシュから削除されたアイテムです。また、データベースのキューには何も表示されません(動的アプリケーションキューも標準エラー/送信キューも表示されません)

私の質問は、データベース内のその追跡テーブルを監視して、このデータの変更を懸念するSQL依存関係にメッセージを送り返すことができるようにすることです。

どんな助けでも大歓迎です...私は多くのオンラインリファレンスを精査してきましたが、これについての具体的な説明を見つけることができません。

4

1 に答える 1

5

データベースに新しいテーブルが作成され、更新を確認するテーブルの名前と変更番号が保持されます。sqldependency用に設定した各テーブルには、先ほど説明した新しいテーブルのchangeidをインクリメントする更新/挿入用に設定されたトリガーがあります。

これがどのように機能するかについてのあなたのメンタルモデルは逆です。アプリケーションはログをチェックして、テーブルが変更されたかどうかを判断します。

したがって、changelogテーブル(私はそれを呼んでいます)がデータベース内の2つのテーブル(Product、User)を追跡している場合は次のようになります。

+Table Name + ChangeNumber +
| Product   | 1            |
+-----------+--------------+
| User      | 1            |
+-----------+--------------+

これらのテーブルのいずれかで何かを変更すると、トリガーがインクリメントChangeNumberされ、変更されたことがわかります。

明らかにこれにはもっと多くのことがありますが、これは一般的な考え方です。

注:1つ以上のテーブルが変更された場合、ページを無効にできることに注意してください。したがって、ページにこれらのテーブルの両方に依存関係が設定されている場合、一方が変更された場合、キャッシュされたページが無効になり、更新されたものが再キャッシュされます。バージョン。

于 2011-09-08T19:55:11.577 に答える