C# Programming

Imageキャッシュ

開発環境: Visual Studio 2005 

1.目次

1.目次
2.目的
3.参考書
4.キャッシュ
 4.1 ページキャッシュ
 4.2 パーシャルキャッシング
 4.3 SqlDataSourceのキャッシュ

2.目的

ASP.NET 2.0のキャッシュについて 正しく理解しておく必要があります。キャッシュの設定を間違えると、Webページでデータベースを更新したのに正しい値が表示されていないというような事が起こります。また、逆に適切にキャッシュを設定しないとパフォーマンスがあがらないということも起こります。

キャッシュは、パフォーマンスとリアルタイム性のトレードオフになるため、どの用に設定するかはとても重要です。

3.参考書

  1.  MSDN: [HOWTO] ASP.NET ページをキャッシュしてパフォーマンスを向上させる方法
  2. MSDN: ASP.NET ページの一部だけのキャッシュ
  3. MSDN: PartialCachingAttribute クラス
  4. MSDN: ASP.NET 2.0 でのキャッシュの改良
  5. CacheKeyDependency

4.キャッシュ

ASP.NET 2.0のキャッシュについては、次の設定場所があります。
 

項目 説明
ページ <%@ OutputCache Duration="10" VaryByParam="none" %>
PartialCaching Web Controlクラス自体に宣言的にキャッシュを指定する。
SqlDataSource データソース自体がキャッシュの機能を持つ。

4.1 ページキャッシュ

ページ自体のキャッシュ設定をページディレクティブにセットする。

<%@ OutputCache Duration="10" VaryByParam="none" %>

Duration は「秒」単位。

VaryByParam は、POSTまたはGETのパラメータを指定する。複数設定する場合は、セミコロンで区切って指定する。

例:
<%@ OutputCache Duration="10" VaryByParam="prama1; param2" %>

4.2 パーシャルキャッシング

Web Controlクラス自体に宣言的にキャッシュを指定することができる。

[PartialCaching(20)]

単位は「秒」。
 

パーシャル キャッシングの使用例
参考文献: MSDN: PartialCachingAttribute クラス
using System.Web.UI;
using System.Web.UI.WebControls;
  // Set the PartialCachingAttribute.Duration property to 20 seconds.
  [PartialCaching(20)]
  public class ctlMine : UserControl

4.3 SqlDataSourceのキャッシュ

ASP.NET 2.0 では、SqlDataSource 自体がキャッシュの機能を持ち、プロパティから設定が可能になっています。デフォルトでは、EnableCachingはFalseになっている。

Image

 

項目 説明
CacheDuration キャッシュの期間(秒)
CacheExpirationPolicy
  • Absolute
    最初のSELECTからCacheDurationの期間、キャッシュを保持する。
  • Sliding
    最初のSELECTからCacheDurationの期間キャッシュを保持するが、キャッシュがエクスパイアする前にSELECTが発行されるとリセットされる。
CacheKeyDependency CacheKeyDependency がエクスパイアすると、すべてのキャッシュをエクスパイアする。
EnableCaching キャッシュするかしないかの設定。
SqlCacheDependency sqlcachedependency="Northwind:Employees"のように「データベース名:テーブル名」で指定する。

 SQL Server 7 と SQL Server 2000 ではaspnet_regsqlcache.exe コマンドによりデータベースのキャッシュの無効化をする必要あり。

 

CacheKeyDependencyの使用例
参考文献: CacheKeyDependency
void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
    Cache[SqlDataSource1.CacheKeyDependency] = someData;
}

void OnItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
{
  Cache.Remove(SqlDataSource1.CacheKeyDependency);
  GridView1.DataBind();
}
Keyを削除するとすべてのキャッシュがクリアされるように動作する。
(未検証)

 

注意
SQL Server 7 と SQL Server 2000 では、どちらのバージョンにも特定のテーブルのデータが変更されたことを関係者に通知するためのメカニズムが組み込まれていないという問題があり(トリガを使うことはできるが既存システムへの影響が大きすぎる)、指定されたデータベース テーブルを指定されたスケジュールでポーリングして変更がないかどうかを確認するという動作を行います。このために生まれたのが、SqlCacheDependency クラスで、データの変更を検出するとキャッシュを無効にする。これにより、最新のデータを取得することができる。

ただし、このためにはSQL Server 7 と SQL Server 2000 では、aspnet_regsqlcache.exe コマンドによりデータベースのキャッシュの無効化を一度だけ設定する必要があります。

例: aspnet_regsqlcache.exe -S (local) -E -d Pubs –ed

もし、ホスティングを利用していて、このような設定ができない場合には、明示的にデータをリロードする必要があります。このためには、SqlDataSource のDataBind()メソッドを呼び出し、データを明示的に更新します。

これを理解していないと、ASP.NET 2.0とSQL 2000との組み合わせで、GridViewが更新されないということになる。Cerviがこの組み合わせなので、思いっきりはまりました。