テーブル内のデータが変更されたときに、SQLCacheDependencyはどのようにリスナーに通信するかをどのように知るのですか?
-
28-10-2019 - |
質問
私はいくつかの調査を行ってきましたが、このシステムの配管の大部分を見ることができますが、たとえば、テーブルのデータが変更されたときに、SQL Serverがどのようにリスナー(アプリケーション)にメッセージを発射するかをどのように知っているかわかりません。私が迷子になっているという点まで、私が理解していることを説明することから始めます。
1)サービスブローカーはデータベースで有効にする必要があり、いくつかの許可を設定する必要があります。
2)データベーススキーマを展開する必要があります。
3)ASPNET_REGSQL.EXEを使用して、データベースとテーブルのSQLキャッシュ依存関係を有効にします。データをキャッシュする必要があります(このステップでは、テーブルを追跡するテーブルを作成し、そのテーブルの変更と値を増やすためにテーブルを追跡し、トリガーします)。
4).NETアプリケーションでSQLキャッシュ依存関係を設定します。たとえば、Webアプリでは、ポーリング時間、接続文字列などに構成値を追加する必要があります。 Global.asax.csの依存関係を開始/停止し、キャッシュにアイテムを追加するときにSQLキャッシュ依存関係を追加します。
4a)依存関係を開始するときに起こることの一部は、インフラストラクチャがキュー、サービス、およびその後の通信とクリーンアップのためのSPROCのために設定されていることです。 SQLクエリプロファイラーを使用すると、接続が作成されていることがわかり、SQL Serverからメッセージを受信するためのアプリケーションの通信チャネルがサービスに設定されています。
5)ここが私が混乱するところです。この時点で、[基礎となるテーブルへのSQLキャッシュ依存性を参照してアプリケーションキャッシュのアイテムをキャッシュしました。その行のアップデートを手動で実行すると、トリガーがヒットされていることと追跡テーブルの値が1で増加していることがわかります。ただし、アプリケーションに戻る通信はありません。アイテムはキャッシュから削除されています。また、データベースのキューには何も表示されません(動的アプリケーションキューも標準のエラー/送信キューもありません)
私の質問は、このデータの変更を懸念するSQL依存関係にメッセージを送信できるように、データベース内の追跡テーブルを見ているのは何ですか?
どんな助けも大歓迎です...私は多くのオンライン参照を精査してきましたが、これについての具体的な説明を見つけることができません。
解決
データベースに新しいテーブルが作成され、更新を確認するテーブルの名前と変更番号が作成されます。 sqldependency用のセットアップがある各テーブルには、私が説明した新しいテーブルのChangeIDを増やす更新/挿入用のトリガーが設定されています。
これがどのように機能するかについてのあなたのメンタルモデルは逆向きです。アプリケーションはログをチェックして、テーブルが変更されたかどうかを判断します。
したがって、Changelogテーブル(私が呼んでいるもの)がデータベース(製品、ユーザー)の2つのテーブルを追跡している場合、このようになります。
+Table Name + ChangeNumber +
| Product | 1 |
+-----------+--------------+
| User | 1 |
+-----------+--------------+
これらのテーブルのいずれかで何かを変更すると、トリガーが増加します ChangeNumber
そして今、私たちは彼らが変わったことを知っています。
明らかにこれにはもっとありますが、これは一般的なアイデアです。
注:1つ以上のテーブルが変更された場合、ページを無効にすることができるため、これらのテーブルの両方に対してページが依存関係に設定されている場合、そのいずれかが変更された場合、キャッシュページが無効になり、更新された更新を再キャッシュすることに注意してください。バージョン。