キャッシュ
開発環境: Visual Studio 2005
1.目次
2.目的
3.参考書
4.キャッシュ
4.1 ページキャッシュ
4.2 パーシャルキャッシング
4.3 SqlDataSourceのキャッシュ
ASP.NET 2.0のキャッシュについて
正しく理解しておく必要があります。キャッシュの設定を間違えると、Webページでデータベースを更新したのに正しい値が表示されていないというような事が起こります。また、逆に適切にキャッシュを設定しないとパフォーマンスがあがらないということも起こります。
キャッシュは、パフォーマンスとリアルタイム性のトレードオフになるため、どの用に設定するかはとても重要です。
- MSDN: [HOWTO] ASP.NET ページをキャッシュしてパフォーマンスを向上させる方法
-
MSDN:
ASP.NET ページの一部だけのキャッシュ
-
MSDN:
PartialCachingAttribute クラス
-
MSDN:
ASP.NET 2.0 でのキャッシュの改良
-
CacheKeyDependency
ASP.NET 2.0のキャッシュについては、次の設定場所があります。
項目 |
説明 |
ページ |
<%@ OutputCache Duration="10" VaryByParam="none" %> |
PartialCaching |
Web Controlクラス自体に宣言的にキャッシュを指定する。 |
SqlDataSource |
データソース自体がキャッシュの機能を持つ。 |
ページ自体のキャッシュ設定をページディレクティブにセットする。
<%@ OutputCache
Duration="10" VaryByParam="none" %>
Duration は「秒」単位。
VaryByParam は、POSTまたはGETのパラメータを指定する。複数設定する場合は、セミコロンで区切って指定する。
例:
<%@ OutputCache Duration="10" VaryByParam="prama1; param2" %>
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
|
ASP.NET 2.0 では、SqlDataSource
自体がキャッシュの機能を持ち、プロパティから設定が可能になっています。デフォルトでは、EnableCachingはFalseになっている。
項目 |
説明 |
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がこの組み合わせなので、思いっきりはまりました。 |