キャッシュ

作成者: Microsoft

キャッシュを理解することは、ASP.NET アプリケーションが十分なパフォーマンスを発揮するために重要です。 ASP.NET 1.x には、キャッシュ用に 3 つの異なるオプションが用意されています。これらは出力キャッシュ、フラグメント キャッシュ、キャッシュ API です。

キャッシュを理解することは、ASP.NET アプリケーションが十分なパフォーマンスを発揮するために重要です。 ASP.NET 1.x には、キャッシュ用に 3 つの異なるオプションが用意されています。これらは出力キャッシュ、フラグメント キャッシュ、キャッシュ API です。 ASP.NET 2.0 では、これら 3 つの方法がすべて提供されますが、さらにいくつかの重要な機能が追加されています。 新しいキャッシュ依存関係がいくつかあり、現在は、開発者はカスタムのキャッシュ依存関係を作成する選択肢もあります。 キャッシュの構成も、ASP.NET 2.0 で大幅に改善されました。

新機能

キャッシュ プロファイル

キャッシュ プロファイルを使用すると、開発者は個々のページに適用できる特定のキャッシュ設定を定義できます。 たとえば、12 時間後にキャッシュから期限切れにする必要があるページがある場合は、それらのページに適用できるキャッシュ プロファイルを簡単に作成できます。 新しいキャッシュ プロファイルを追加するには、構成ファイル内の <outputCacheSettings> セクションを使用します。 例として、12 時間のキャッシュ期間を構成する twoday という名前のキャッシュ プロファイルの構成を次に示します。

<outputCacheSettings>
    <outputCacheProfiles>
        <add name="TwoDay" duration="43200" />
    </outputCacheProfiles>
</outputCacheSettings>

このキャッシュ プロファイルを特定のページに適用するには、次に示すように、@ OutputCache ディレクティブの CacheProfile 属性を使用します。

<%@ OutputCache CacheProfile="TwoDay" %>

カスタムのキャッシュ依存関係

ASP.NET 1.x の開発者は、カスタムのキャッシュ依存関係を作成できる機能を求め続けてきました。 ASP.NET 1.x では、CacheDependency クラスはシールドされていたため、開発者はそこから独自のクラスを派生させることはできませんでした。 ASP.NET 2.0 では、その制限は削除され、開発者は、独自のカスタムのキャッシュ依存関係を自由に開発できます。 CacheDependency クラスを使用して、ファイル、ディレクトリ、またはキャッシュ キーに基づいて、カスタムのキャッシュ依存関係を作成できるようになりました。

例として、Web アプリケーションのルートにある stuff.xml というファイルに基づいて、新しいカスタムのキャッシュ依存関係を作成するコードを次に示します。

System.Web.Caching.CacheDependency dep = new
    System.Web.Caching.CacheDependency(Server.MapPath("stuff.xml"));
Response.AddCacheDependency(dep);
Cache.Insert("key", "value");

このシナリオでは、stuff.xml ファイルが変更されると、キャッシュされた項目が無効になります。

キャッシュ キーを使用してカスタムのキャッシュ依存関係を作成することもできます。 このメソッドを使用すると、キャッシュ キーが削除されたときに、キャッシュされたデータが無効になります。 次に例を示します。

// insert a value into cache that will serve
// as the cache key
Cache["CacheKey"] = "something";

// create an array of cache keys
string[] keys = new String[1];
keys[0] = "CacheKey";

CacheDependency dep = new CacheDependency(null, keys);

// insert an item into cache with a dependency on
// the above CacheDependency
Cache.Insert("Key", "Value", dep);

上記で挿入した項目を無効にするには、キャッシュ キーとして機能するようにキャッシュに挿入された項目を削除するだけです。

// Remove the cache item that serves as the cache key
Cache.Remove("CacheKey");

キャッシュ キーとして機能する項目のキーは、キャッシュ キーの配列に追加される値と同じである必要があることに注意してください。

ポーリング ベースの SQL キャッシュ依存関係 (テーブルベースの依存関係とも呼ばれる)

SQL Server 7 と SQL Server 2000 では、SQL キャッシュ依存関係にポーリング ベースのモデルが使用されます。 ポーリング ベースのモデルでは、テーブル内のデータが変更されたときにトリガーされるデータベース テーブル上で、トリガーが使用されます。 このトリガーは、ASP.NET が定期的にチェックする通知テーブルの changeId フィールドを更新します。 changeId フィールドが更新された場合、ASP.NET はデータが変更されたことを認識し、キャッシュされたデータを無効にします。

Note

SQL Server 2005 でポーリング ベースのモデルを使用することもできますが、ポーリング ベースのモデルは最も効率的なモデルではないため、SQL Server 2005 ではクエリ ベースのモデル (後述) を使用することをお勧めします。

ポーリング ベースのモデルを使用する SQL キャッシュ依存関係が正しく機能するためには、テーブルで通知が有効になっている必要があります。 これは、SqlCacheDependencyAdmin クラスを使用するか、aspnet_regsql.exe ユーティリティを使用して、プログラムによって実行できます。

次のコマンド ラインは、SQL キャッシュ依存関係用の dbase という名前の SQL Server インスタンスに配置された Northwind データベースに、Products テーブルを登録します。

aspnet_regsql -S dbase -ed -d Northwind -E -et -t Products

上記のコマンドで使用されるコマンド ライン スイッチの説明を次に示します。

コマンドライン スイッチ 目的
-S server サーバー名を指定します。
-ed SQL キャッシュ依存関係に対してデータベースを有効にする必要があることを指定します。
-d database_name SQL キャッシュ依存関係に対して有効にする必要があるデータベース名を指定します。
E- データベースに接続するときに、aspnet_regsql が Windows 認証を使用する必要があることを指定します。
-et SQL キャッシュ依存関係のデータベース テーブルを有効にすることを指定します。
-t table_name SQL キャッシュ依存関係に対して有効にするデータベース テーブルの名前を指定します。

Note

aspnet_regsql.exe に使用できるその他のスイッチがあります。 完全な一覧については、aspnet_regsql.exe -? を コマンド ラインから実行します。

このコマンドを実行すると、SQL Server データベースに次の変更が加えられます。

  • AspNet_SqlCacheTablesForChangeNotification テーブルが追加されます。 このテーブルには、SQL キャッシュ依存関係が有効になっているデータベース内のテーブルにつき 1 行が含まれています。
  • 次のストアド プロシージャが、データベース内に作成されます。
AspNet_SqlCachePollingStoredProcedure AspNet_SqlCacheTablesForChangeNotification テーブルに対してクエリを実行し、SQL キャッシュ依存関係が有効になっているすべてのテーブルと、各テーブルの changeId の値を返します。 このストアド プロシージャは、データが変更されたかどうかを判断するためにポーリングに使用されます。
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure AspNet_SqlCacheTablesForChangeNotification テーブルに対してクエリを実行し、SQL キャッシュ依存関係が有効になっているすべてのテーブルを返します。
AspNet_SqlCacheRegisterTableStoredProcedure 通知テーブルに必要なエントリを追加して、SQL キャッシュ依存関係のテーブルを登録し、トリガーを追加します。
AspNet_SqlCacheUnRegisterTableStoredProcedure 通知テーブル内のエントリを削除して、SQL キャッシュ依存関係のテーブルの登録を解除し、トリガーを削除します。
AspNet_SqlCacheUpdateChangeIdStoredProcedure 変更されたテーブルに対して changeId をインクリメントして、通知テーブルを更新します。 ASP.NET では、データが変更されたかどうかを判断するために、この値を使用します。 次に示すように、このストアド プロシージャは、テーブルが有効になったときに作成されたトリガーによって実行されます。
  • テーブルに対して table_name_AspNet_SqlCacheNotification_Trigger という SQL Server トリガーが作成されます。 このトリガーは、テーブルに対して INSERT、UPDATE、DELETE が実行されたときに、AspNet_SqlCacheUpdateChangeIdStoredProcedure を実行します。
  • aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess という SQL Server ロールがデータベースに追加されます。

aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess SQL Server ロールには、AspNet_SqlCachePollingStoredProcedure に対する EXEC アクセス許可があります。 ポーリング モデルが正しく機能するためには、お使いのプロセス アカウントを aspnet_ChangeNotification_ReceiveNotificationsOnlyAccess ロールに追加する必要があります。 aspnet_regsql.exe ツールでは、この処理は実行されません。

ポーリング ベースの SQL キャッシュ依存関係の構成

ポーリング ベースの SQL キャッシュ依存関係を構成するには、いくつかの手順が必要です。 最初の手順で、前述のようにデータベースとテーブルを有効にします。 その手順が完了すると、構成の残りの部分は次のようになります。

  • ASP.NET 構成ファイルの構成
  • SqlCacheDependency の構成

ASP.NET 構成ファイルの構成

前のモジュールで説明したように接続文字列を追加するだけでなく、次に示すように、<sqlCacheDependency> 要素を使用して <cache> 要素を構成する必要もあります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="Pubs"
    connectionString="Data Source=(local);
      Initial Catalog=pubs;Integrated Security=true;"
    providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <caching>
      <sqlCacheDependency enabled = "true" pollTime = "60000" >
        <databases>
          <add name="pubs" connectionStringName = "pubs" pollTime = "9000000" />
        </databases>
      </sqlCacheDependency>
    </caching>
  </system.web>
</configuration>

この構成により、pubs データベースに対する SQL キャッシュ依存関係が有効になります。 <sqlCacheDependency> 要素の pollTime 属性は、既定で 60000 ミリ秒または 1 分であることに注意してください。 (この値は、500 ミリ秒未満にはできません。)この例では、<add> 要素によって新しいデータベースが追加され、pollTime がオーバーライドされ、9000000 ミリ秒に設定されます。

SqlCacheDependency の構成

次の手順で、SqlCacheDependency を構成します。 これを実現する最も簡単な方法は、@ Outcache ディレクティブで SqlDependency 属性の値を次のように指定する方法です。

<%@ OutputCache duration="60"
    VaryByParam="none" SqlDependency="pubs:authors" %>

上記の @ OutputCache ディレクティブでは、pubs データベースの authors テーブルに対する SQL キャッシュ依存関係が構成されています。 複数の依存関係は、セミコロンで区切り、次のように示して構成します。

<%@ OutputCache duration="60"
    VaryByParam="none"
    SqlDependency="database_name:table_name;database_name:table_name" %>

SqlCacheDependency を構成するもう 1 つの方法は、プログラムによって構成することです。 次のコードでは、pubs データベース内の authors テーブルに対して新しい SQL キャッシュ依存関係を作成します。

SqlCacheDependency dep = new SqlCacheDependency("pubs", "authors");

SQL キャッシュ依存関係をプログラムを使用して定義する利点の 1 つは、発生する可能性のある例外を処理できることです。 たとえば、通知が有効になっていないデータベースの SQL キャッシュ依存関係を定義しようとすると、DatabaseNotEnabledForNotificationException 例外がスローされます。 その場合は、SqlCacheDependencyAdmin.EnableNotifications メソッドを呼び出してデータベース名を渡すことで、通知に対してデータベースを有効にできます。

同様に、通知が有効になっていないテーブルの SQL キャッシュ依存関係を定義しようとすると、TableNotEnabledForNotificationException がスローされます。 その後、SqlCacheDependencyAdmin.EnableTableForNotifications メソッドを呼び出して、データベース名とテーブル名を渡すことができます。

次のコード サンプルは、SQL キャッシュ依存関係を構成するときに、例外処理を適切に構成する方法を示しています。

try {
    SqlCacheDependency SqlDep = new
    SqlCacheDependency("pubs", "authors");
} catch (DatabaseNotEnabledForNotificationException exDBDis) {
    try {
        SqlCacheDependencyAdmin.EnableNotifications("pubs");
    } catch (UnauthorizedAccessException exPerm) {
        Response.Redirect("ErrorPage.htm");
    }
} catch (TableNotEnabledForNotificationException exTabDis) {
    try {
        SqlCacheDependencyAdmin.EnableTableForNotifications("pubs",
        "authors");
    } catch (System.Data.SqlClient.SqlException exc) {
        Response.Redirect("ErrorPage.htm");
    }
} finally {
    Cache.Insert("SqlSource", Source1, SqlDep);
}

詳細情報: https://msdn.microsoft.com/library/t9x04ed2.aspx

クエリ ベースの SQL キャッシュ依存関係 (SQL Server 2005 のみ)

SQL キャッシュ依存関係に SQL Server 2005 を使用する場合、ポーリング ベースのモデルは必要ありません。 SQL Server 2005 と共に使用する場合、SQL キャッシュ依存関係は、SQL Server 2005 クエリ通知を使用して、SQL Server インスタンスへの SQL 接続を介して直接通信します (それ以上の構成は必要ありません)。

クエリベースの通知を有効にする最も簡単な方法は、宣言を使用する方法です。データ ソース オブジェクトの SqlCacheDependency 属性を CommandNotification に設定し、EnableCaching 属性を true に設定して実行します。 このメソッドを使用すると、コードは必要ありません。 データ ソースに対して実行されたコマンドの結果が変更されると、キャッシュ データが無効になります。

次の例では、SQL キャッシュ依存関係のデータ ソース管理を構成します。

<asp:SqlDataSource ID="ProductList" runat="server"
    ConnectionString="<%$ ConnectionStrings:Northwind %>"
    EnableCaching="true"
    SqlCacheDependency="CommandNotification"
    SelectCommand="SELECT * FROM [Products]" />

この場合、SelectCommand で指定されたクエリが、最初とは異なる結果を返した場合、キャッシュされた結果は無効になります。

@ OutputCache ディレクティブの SqlDependency 属性を CommandNotification に設定することで、SQL キャッシュ依存関係に対し、すべてのデータ ソースを有効にするように指定することもできます。 次の例は、これを示しています。

<%@ OutputCache SqlDependency="CommandNotification" 
    duration="60" VaryByParam="none" %>

Note

SQL Server 2005 のクエリ通知の詳細については、Microsoft SQL Server オンライン ブックを参照してください。

クエリ ベースの SQL キャッシュ依存関係を構成するもう 1 つの方法は、SqlCacheDependency クラスを使用して、プログラムによって構成することです。 この方法を次のコード サンプルに示します。

string sql = "SELECT ProductName, ProductID FROM Products";
SqlConnection conn = new
SqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);
SqlCommand cmd = new SqlCommand(sql, conn);
SqlCacheDependency dep = new SqlCacheDependency(cmd);
Response.AddCacheDependency(dep);

詳細情報: https://msdn.microsoft.com/library/default.asp?url=/library/enus/dnvs05/html/querynotification.asp

キャッシュ後の置換

ページをキャッシュすると、Web アプリケーションのパフォーマンスが大幅に向上する可能性があります。 ただし、場合によっては、ページのほとんどの部分をキャッシュし、ページ内のいくつかのフラグメントは動的にする必要があります。 たとえば、設定された期間にわたって完全に静的なニュース記事のページを作成する場合は、ページ全体をキャッシュするように設定できます。 ページ要求ごとに毎回変更されるローテーションする広告バナーを含める場合は、その広告を含むページの部分を動的にする必要があります。 ページをキャッシュし、一部のコンテンツを動的に置き換えるために、ASP.NET のキャッシュ後の置換を使用できます。 キャッシュ後の置換では、ページ全体が出力キャッシュされ、その中の特定の部分が、キャッシュからの除外としてマークされます。 広告バナーの例では、AdRotator コントロールを使用すると、キャッシュ後の置換機能を利用して、各ユーザーと各ページ更新ごとに広告が動的に作成されるようにすることができます。

キャッシュ後の置換を実装するには、次の 3 つの方法があります。

  • 宣言によって、置換コントロールを使用して行います。
  • プログラムによって、置換コントロール API を使用して行います。
  • 暗黙的に、AdRotator コントロールを使用して行います。

置換コントロール

ASP.NET の置換コントロールは、キャッシュされたページでなく、動的に作成されるキャッシュされたページのセクションを指定します。 置換コントロールは、動的コンテンツを表示するページ上の場所に配置します。 置換コントロールは、実行時に MethodName プロパティで指定したメソッドを呼び出します。 メソッドは文字列を返す必要があります。この文字列は、置換コントロールの内容を置き換えます。 メソッドは、Page コントロールまたは UserControl コントロールが格納されている静的メソッドである必要があります。 置換コントロールを使用すると、クライアント側のキャッシュ可能性がサーバーのキャッシュ可能性に変更され、ページがクライアントにキャッシュされなくなります。 そのため、ページに対するそれ以降の要求では、メソッドは再度呼び出され、動的コンテンツが生成されるようになります。

置換 API

キャッシュされたページの動的コンテンツをプログラムで作成するには、ページ コードで WriteSubstitution メソッドを呼び出し、メソッドの名前をパラメーターとして渡します。 動的コンテンツの作成を処理するメソッドは、1 つの HttpContext パラメーターを受け取り、文字列を返します。 戻り値の文字列は、指定された場所で置き換えられるコンテンツです。 宣言によって置換コントロールを使用する代わりに、WriteSubstitution メソッドを呼び出す利点は、Page または UserControl オブジェクトの静的メソッドを呼び出すのではなく、任意のオブジェクトのメソッドを呼び出すことができる点にあります。

WriteSubstitution メソッドを呼び出すと、クライアント側のキャッシュ可能性がサーバーのキャッシュ可能性に変更され、ページがクライアントにキャッシュされなくなります。 そのため、ページに対するそれ以降の要求では、メソッドは再度呼び出され、動的コンテンツが生成されるようになります。

AdRotator コントロール

AdRotator サーバー コントロールは、キャッシュ後の置換のサポートを内部的に実装します。 ページに AdRotator コントロールを配置すると、親ページがキャッシュされているかどうかに関係なく、要求ごとに一意の広告がレンダリングされます。 その結果、AdRotator コントロールを含むページは、サーバー側でのみキャッシュされます。

ControlCachePolicy クラス

ControlCachePolicy クラスを使用すると、ユーザー コントロールを使用してフラグメント キャッシュをプログラムによって制御できます。 ASP.NET は、BasePartialCachingControl インスタンス内にユーザー コントロールを埋め込みます。 BasePartialCachingControl クラスは、出力キャッシュが有効になっているユーザー コントロールを表します。

PartialCachingControl コントロールの BasePartialCachingControl.CachePolicy プロパティにアクセスすると、常に有効な ControlCachePolicy オブジェクトを受け取ります。 ただし、UserControl コントロールの UserControl.CachePolicy プロパティにアクセスする場合は、ユーザー コントロールが BasePartialCachingControl コントロールによって既にラップされている場合にのみ、有効な ControlCachePolicy オブジェクトを受け取ります。 ラップされていない場合、このプロパティによって返される ControlCachePolicy オブジェクトを操作しようとすると、例外がスローされます。これは、このオブジェクトに関連付けられた BasePartialCachingControl がないためです。 例外を生成せずに UserControl インスタンスがキャッシュをサポートしているかどうかを確認するには、SupportsCaching プロパティを調べます。

ControlCachePolicy クラスの使用は、出力キャッシュを有効にするいくつかの方法の 1 つです。 次の一覧では、出力キャッシュを有効にするために使用できるメソッドについて説明します。

  • 宣言によるシナリオで出力キャッシュを有効にするには、@ OutputCache ディレクティブを使用します。
  • PartialCachingAttribute 属性を使用して、分離コード ファイル内のユーザー コントロールのキャッシュを有効にします。
  • プログラムを使用するシナリオでキャッシュ設定を指定するには、ControlCachePolicy クラスを使用します。このシナリオでは、前のいずれかのメソッドを使用してキャッシュが有効になっており、System.Web.UI.TemplateControl.LoadControl メソッドを使用して動的に読み込まれた BasePartialCachingControl インスタンスを操作します。

ControlCachePolicy インスタンスは、コントロール ライフ サイクルの Init ステージと PreRender ステージの間でのみ正常に操作できます。 PreRender フェーズの後に ControlCachePolicy オブジェクトを変更した場合、ASP.NET は例外をスローします。これは、コントロールはレンダリング ステージ中にキャッシュされるため、コントロールのレンダリング後に行われた変更が、キャッシュ設定に実際に影響を与えることがないためです。 最後に、ユーザー コントロール インスタンス (およびその ControlCachePolicy オブジェクト) は、実際にレンダリングされた場合にのみプログラムによる操作に使用できます。

キャッシュ構成への変更 - <caching> 要素

ASP.NET 2.0 でのキャッシュ構成にはいくつかの変更が加えられています。 <caching> 要素は ASP.NET 2.0 の新機能であり、構成ファイル内でキャッシュ構成を変更できます。 次の属性を使用できます。

要素 説明
cache 省略可能な要素です。 グローバル アプリケーション キャッシュ設定を定義します。
outputCache 省略可能な要素です。 アプリケーション全体の出力キャッシュ設定を指定します。
outputCacheSettings 省略可能な要素です。 アプリケーションのページに適用できる出力キャッシュ設定を指定します。
sqlCacheDependency 省略可能な要素です。 ASP.NET アプリケーションの SQL キャッシュ依存関係を構成します。

<cache> 要素

<cache> 要素では、次の属性を使用できます。

属性 説明
disableMemoryCollection 省略可能で、 Boolean 型の属性。 コンピューターのメモリ負荷が高いときに発生するキャッシュ メモリ コレクションが無効かどうかを示す値を取得または設定します。
disableExpiration 省略可能で、 Boolean 型の属性。 キャッシュの有効期限が無効かどうかを示す値を取得または設定します。 無効にすると、キャッシュされた項目は期限切れにならず、期限切れのキャッシュ項目のバックグラウンド清掃は行われません。
privateBytesLimit 省略可能な Int64 属性。 キャッシュが期限切れの項目のフラッシュを開始し、メモリの再利用を試みる前に、アプリケーションのプライベート バイトの最大サイズを示す値を取得または設定します。 この制限には、キャッシュで使用されるメモリと、実行中のアプリケーションからの通常のメモリ オーバーヘッドの両方が含まれます。 ゼロを設定すると、ASP.NET がメモリの再利用を開始する時期を決定するうえで、独自のヒューリスティックを使用することを示します。
percentagePhysicalMemoryUsedLimit 省略可能な Int32 属性。 キャッシュが期限切れの項目のフラッシュを開始し、メモリの再利用を試みる前に、アプリケーションが消費できるマシンの物理メモリの最大割合を示す値を取得または設定します。このメモリ使用量には、キャッシュで使用されるメモリ使用量と、実行中のアプリケーションからの通常のメモリ使用量の両方が含まれます。 ゼロを設定すると、ASP.NET がメモリの再利用を開始する時期を決定するうえで、独自のヒューリスティックを使用することを示します。
privateBytesPollTime 省略可能な TimeSpan 属性。 アプリケーションのプライベート バイト メモリ使用量のポーリング時間間隔を示す値を取得または設定します。

<outputCache> 要素

<outputCache> 要素には、次の属性を使用できます。

属性 説明
enableOutputCache 省略可能で、 Boolean 型の属性。 ページ出力キャッシュを有効または無効にします。 無効にした場合、プログラムによる設定または宣言による設定に関係なく、ページはキャッシュされません。 既定値は " [はい] " です。
enableFragmentCache 省略可能で、 Boolean 型の属性。 アプリケーション フラグメント キャッシュを有効または無効にします。 無効にした場合、@ OutputCache ディレクティブまたは使用されるキャッシュ プロファイルに関係なく、ページはキャッシュされません。 アップストリーム プロキシ サーバーとブラウザー クライアントが、ページ出力のキャッシュを試行してはならないことを示すキャッシュ制御ヘッダーを含めます。 既定値は false です。
sendCacheControlHeader 省略可能で、 Boolean 型の属性。 cache-control:private ヘッダーが既定で出力キャッシュ モジュールによって送信されるかどうかを示す値を取得または設定します。 既定値は false です。
omitVaryStar 省略可能で、 Boolean 型の属性。 応答で Http "Vary: </strong>" ヘッダーを送信することを有効または無効にします。既定の設定が false の場合、出力キャッシュされたページに対して "*Vary: *" ヘッダーが送信されます。Vary ヘッダーが送信されるときに、Vary ヘッダーでの指定内容に基づき、異なるバージョンがキャッシュされるように設定できます。たとえば、Vary:User-Agents は、要求を発行したユーザー エージェントに基づいて、異なるバージョンのページを格納します。既定値は **false です。

<outputCacheSettings> 要素

<outputCacheSettings> 要素を使用すると、前述のようにキャッシュ プロファイルを作成できます。 <outputCacheSettings> 要素の唯一の子要素は、キャッシュ プロファイルを構成するための <outputCacheProfiles> 要素です。

<sqlCacheDependency> 要素

<sqlCacheDependency> 要素には、次の属性を使用できます。

属性 説明
有効 必須の Boolean 属性。 変更がポーリングされているかどうかを示します。
pollTime 省略可能な Int32 属性。 SqlCacheDependency がデータベース テーブルの変更をポーリングする頻度を設定します。 この値は、連続するポーリングの間のミリ秒数に対応します。 500 ミリ秒未満に設定することはできません。 既定値は 1 分です。

その他の情報

キャッシュの構成に関して注意する必要がある追加情報がいくつかあります。

  • ワーカー プロセスのプライベート バイトの制限が設定されていない場合、キャッシュでは次のいずれかの制限が使用されます。

    • x86 2 GB: 物理 RAM の 800 MB または 60% のいずれか小さい方
    • x86 3 GB: 物理 RAM の 1800 MB または 60% のいずれか小さい方
    • x64: 物理 RAM の 1 テラバイトまたは 60% のいずれか小さい方
  • ワーカー プロセスのプライベート バイトの制限と <cache privateBytesLimit/> の両方が設定されている場合、キャッシュでは 2 つのうちの最小が使用されます。

  • 1.x と同様に、キャッシュ エントリを削除して、次の 2 つの理由の場合に GC.Collect を呼び出します。

    • プライベート バイトの制限に非常に近い
    • 使用可能なメモリが 10% に近いか 10% 未満である
  • <cache percentagePhysicalMemoryUseLimit/> を 100 に設定することで、使用可能なメモリが少ない状態では、トリミングとキャッシュを効果的に無効にすることができます。

  • 1.x とは異なり、2.0 はトリムを中断し、最後の GC の場合は呼び出しを収集します。Collect では、(キャッシュ) メモリ制限の 1% を超えるプライベート バイトまたはマネージド ヒープのサイズが削減されませんでした。

ラボ 1: カスタムのキャッシュ依存関係

  1. 新しい Web サイトを作成します。

  2. cache.xml という名前の新しい XML ファイルを追加し、Web アプリケーションのルートに保存します。

  3. default.aspx の分離コードの Page_Load メソッドに、次のコードを追加します。

    System.Web.Caching.CacheDependency dep = new
        System.Web.Caching.CacheDependency(Server.MapPath("cache.xml"));
    Response.AddCacheDependency(dep);
    Cache.Insert("time", DateTime.Now.ToString());
    Response.Write(Cache["time"]);
    
  4. ソース ビューの default.aspx の先頭に、次を追加します。

    <%@ OutputCache Duration="240" VaryByParam="None" %>
    
  5. Default.aspx を参照します。 時間に何と表示されていますか?

  6. ブラウザーを更新します。 時間に何と表示されていますか?

  7. cache.xml を開き、次のコードを追加します。

    <anElement></anElement>
    
  8. cache.xml を保存します。

  9. ブラウザーを更新します。 時間に何と表示されていますか?

  10. 以前にキャッシュされた値を表示するのではなく、時刻が更新された理由を説明してください。

ラボ 2: ポーリング ベースのキャッシュ依存関係の使用

このラボでは、GridView コントロールと DetailsView コントロールを介して、Northwind データベース内のデータを編集できる前のモジュールで作成したプロジェクトを使用します。

  1. Visual Studio 2005 でプロジェクトを開きます。

  2. Northwind データベースに対して aspnet_regsql ユーティリティを実行して、このデータベースと Products テーブルを有効にします。 Visual Studio コマンド プロンプトから次のコマンドを使用します。

    aspnet_regsql -S server -ed -d Northwind -E -et -t Products
    
  3. web.config ファイルに次のコードを追加します。

    <caching>
        <sqlCacheDependency enabled = "true" pollTime = "60000" >
            <databases>
                <add name="Northwind" connectionStringName = "Northwind" pollTime = "9000000" />
            </databases>
        </sqlCacheDependency>
    </caching>
    
  4. showdata.aspx という名前の新しい Web フォームを追加します。

  5. showdata.aspx ページに次の @ outputcache ディレクティブを追加します。

    <%@ OutputCache SqlDependency="Northwind:Products" Duration="480" VaryByParam="None"%>
    
  6. showdata.aspx の Page_Load に次のコードを追加します。

    Response.Write(DateTime.Now.ToString() + "<br><br>");
    
  7. 新しい SqlDataSource コントロールを showdata.aspx に追加し、Northwind データベース接続を使用するように構成します。 [次へ] をクリックします。

  8. [ProductName] チェック ボックスと [ProductID] チェック ボックスをオンにし、[次へ] をクリックします。

  9. [完了] をクリックします。

  10. showdata.aspx ページに新しい GridView を追加します。

  11. ドロップダウンから [SqlDataSource1] を選択します。

  12. showdata.aspx を保存して参照します。 表示される時間をメモしておきます。