.NET 1.1 では、キャッシュはファイル システム、オブジェクトなどに基づいてのみキャッシュの依存関係を作成できますが、.NET 2.0 では新しい依存関係である SqlCacheDependency が提供され、これによりキャッシュがデータベースの変更に依存できるようになります。このアプローチは 1.1 の回避策に似ていますが、それらの間には本質的な違いがあります (SqlCacheDependency オブジェクトの提供)。 (1.1 の回避策は、データ テーブルのトリガーを作成し、そのトリガーがトリガーされたときにローカル ファイルを変更することです。システム内の特定のキャッシュの依存関係はこのローカル ファイルであり、キャッシュにキャッシュされた内容をキャッシュに通知します。データが変更されました)
.NET 2.0 の SqlCacheDependency は、SqlServer2000 以降のバージョンで使用できます。この記事では、Sql Server 2000 での使用方法を紹介します。Sql Server 2005 は少し異なります。
まず、.NET 2.0 フレームワークをインストールする必要があります。もちろん、Sql Server 2000 が使用可能である必要があります。 .NET 2.0 では、Microsoft はユーティリティ ツール aspnet_regsql (aspnet_regiis と同じディレクトリ内) を提供しています。これはコマンド ライン ツールであり、aspnet_regsql -? を通じて取得できます。ここでは、次のパラメータに注目します。 -ed は SQL キャッシュ依存関係のデータベースを開始します。 -E は認証に現在の Windows 資格情報を使用します。 -d はアプリケーション サーバーのデータベース名に使用されます。データベース名が指定されていない場合は、デフォルトが使用されます。データベースは「aspnetdb」を使用します。この記事では、Microsoft のサンプル データベース pubs を使用します。次に、次のコマンド ラインを使用してキャッシュ依存データベースを作成する必要があります:
aspnet_regsql -ed -E -d pubs
(注: ここでのコマンド ライン パラメーターでは大文字と小文字が区別されます)
このコマンドを実行した後、Pubs データベースを開いて、どのような変更が行われたかを確認できます。このテーブルには、AspNet_SqlCacheTablesForChangeNotification という 3 つのフィールドがあります。テーブル名、notificationCreated: 作成時刻。 changeId: 変更番号 (累積フィールド)。また、データベースにはさらにいくつかのストアド プロシージャ (
AspNet_SqlCacheRegisterTableStoredProcedure、
AspNet_SqlCacheUnRegisterTableStoredProcedure、AspNet_SqlCacheUnRegisterTableStoredProcedure)
があることもわかります。
AspNet_SqlCacheUpdateChangeIdStoredProcedure、
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure、
AspNet_SqlCachePollingStoredProcedure
これらのストアド プロシージャは文字通り理解しやすく、クエリ アナライザーで開くとその詳細を確認できます。テーブルの変更を監視するには、AspNet_SqlCacheRegisterTableStoredProcedure ストアド プロシージャを実行して、監視する必要があるテーブルを指定する必要があります。もちろん、コマンド ラインは次のとおりです。
aspnet_regsql -et -E -d pubs -t authors
上記のコマンドを実行すると、aspnet_regsql によって作成者用のトリガーが作成されます。コマンドの実行後に作成したトリガーは次のとおりです。
QUOTED_IDENTIFIER をオンに設定
行く
ANSI_NULLS をオンに設定
行く
ALTER TRIGGER dbo.[authors_AspNet_SqlCacheNotification_Trigger] ON [著者]
開始時に挿入、更新、削除の場合
ノーカウントをオンに設定
EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'authors'
終わり
行く
QUOTED_IDENTIFIER をオフに設定
行く
ANSI_NULLS をオンに設定
行く
トリガーからわかるように、ストアド プロシージャ AspNet_SqlCacheUpdateChangeIdStoredProcedure は、authors テーブルが挿入、削除、更新されるときに実行され、AspNet_SqlCacheTablesForChangeNotification テーブルにレコードを追加します。記録は次のとおりです。
テーブル名通知作成された変更 ID
著者 2006-06-20 09:38:26.267 1
authors のデータに変更を加えると、changeId が蓄積され、他のフィールドは変更されません。
次に、web.config にコンテンツを追加する必要があります。そうすれば、それを使用できるようになります。
まずデータベース接続文字列を追加します。
<接続文字列>
<add name="pubsConString" connectionString="server=localhost;database=pubs;uid=sa;pwd=mypassword;"/>
、
キャッシュ セクションを追加します。
<システム.ウェブ>
<キャッシング>
<sqlCacheDependencyenabled="true">
<データベース>
<add name="pubs" connectionStringName="pubsConString"pollTime="900"/>
</データベース>
</sqlキャッシュ依存関係>
</キャッシュ>
</system.web>
以下はテスト コードです。ページが読み込まれると、次のコードが実行されます。
protected void Page_Load(object sender, EventArgs e) {
if (HttpContext.Current.Cache["xxx"] == null) {
SqlCacheDependency d = new SqlCacheDependency("pubs","authors");//pubs はデータベース セクションで指定されたパブで、その後にテーブル名が続きます
HttpContext.Current.Cache.Insert("xxx", "xxx", d);
Response.Write("新しいキャッシュ値を作成するのは xxx です。");
}
それ以外{
Response.Write("キャッシュからデータをロードします。値は "+HttpContext.Current.Cache["xxx"].ToString());
}
}
このページを初めて開くと、次の内容が表示されます。
新しいキャッシュの作成値は xxx です。
ページを更新すると、次のように表示されます。
キャッシュからデータをロードします。値は xxx です。
クエリ アナライザーを使用して作成者のデータを変更し、ページを再度更新すると、次のように表示されます。
新しいキャッシュの作成値は xxx です。
これは、キャッシュが正常に動作していることを示しています。authors テーブルが変更されると、キャッシュ内の内容は自動的に無効になり、アプリケーションもキャッシュ オブジェクトを再作成します。
注: SqlCacheDependency は 2 つのコンストラクターで構成されており、SqlServer2000 は 2 つのパラメーターのみをサポートし、1 つのパラメーターは SqlServer2005 をサポートします。