連載

ASP.NET 2.0が変えるWebアプリ開発の世界

第8回 新キャッシュ&コールバック機能でパフォーマンス改善

山田 祥寛
2005/03/26
Page1 Page2 Page3


Back Issue
1
周辺技術が支えるASP.NET 2.0の進化
2
ASP.NET 2.0のマスター・ページとサイトマップ
3
ASP.NET 2.0のログイン管理とウィザード・ページ
4 データアクセス・コントロールとクリッカブル・マップ
5 ASP.NET 2.0の「Webパーツ」コントロール

6

ASP.NET 2.0の検証コントロール
7 テーマとプロファイルでユーザー指向のページを作成

 前回は、ASP.NET 2.0で導入されたサーバ・コントロール「以外」の新機能として、テーマやプロファイル機能など、主にデザイン部分にかかわる内容を紹介した。

 今回はそれに引き続き「パフォーマンス編」として、データベースの内容を変更したタイミングでキャッシュ・データをリフレッシュする「データベース・キャッシング」やページ全体をリフレッシュすることなくポストバックを行う「クライアント・コールバック」を解説する。

●「データベース・キャッシング」でキャッシング機能を強化

 .NET TIPS「[ASP.NET]Webフォーム・ページの一部分を断片的にキャッシングするには?」「[ASP.NET]リクエスト・パラメータごとにページをキャッシングするには?」などでも紹介したように、ASP.NETにおける特徴の1つとして、キャッシング機能が充実している点が挙げられる。ASP.NETのキャッシング技術を利用することで、動的ページのキャッシュ処理を限りなくプログラムレスで実現できる。

 しかし、ASP.NET 1.xのキャッシング技術には、1つ致命的ともいうべき問題があった。それは、データベースに対してキャッシュ・データの依存関係を設定できない点だ。ASP.NET 1.xではキャッシュ依存を設定しておくことで、依存関係にあるほかのキャッシュ・データやファイルが変更されたタイミングで、キャッシュ・データをリフレッシュすることができる(詳細は、.NET TIPS「[ASP.NET]キャッシュ破棄のタイミングを指定するには?」を参照いただきたい)。しかし、データベースに対しては直接の依存関係を設定できないため、ASP.NET 1.xでは、.NET TIPS「[ASP.NET]データベース更新のタイミングでキャッシュを破棄するには?」でも紹介したような、いささかトリッキーな手法を用いる必要がある。アプリケーションで利用しているデータの多くが、データベース・サーバを基にしていることを考えれば、これはバランスを欠いているとしか思えない仕様であった。

 しかし、ASP.NET 2.0では新たにデータベース・キャッシングの機能が追加された。これによって、データベースを変更するタイミングでのキャッシュ更新を、プログラムレスで実現できるようになる。ただし、データベース・キャッシングが対象とするデータベースはMicrosoft SQL Server 7.0以降(MSDEを含む)のみであるので、ご注意いただきたい。

○データベース上でデータベース・キャッシングを有効化する

 データベース・キャッシングを利用するには、まず「データベース・キャッシングの有効化」という作業をデータベース上の対象テーブルに対して施す必要がある。

 もっとも、有効化の作業はさほどに難しいことではない。.NET Framework SDK 2.0(Visual Studio 2005に含まれる)で提供されるコマンドライン・ツール「aspnet_regsql.exe」を利用して、以下のようなコマンドを発行するだけでよい(spnet_regsql.exeは、デフォルトで「C:\WINDOWS\Microsoft.NET\Framework\<バージョン番号>」フォルダに含まれている)。

> aspnet_regsql.exe -S (local) -U sa -P sa -ed -d wings -et -t master
コマンドライン・ツール「aspnet_regsql.exe」の実行方法
-SオプションはSQL Serverの(インスタンス名を含めた)サーバ名、-Uオプションはユーザー名、-Pオプションはパスワード、-dオプションはデータベース名、-tオプションはテーブル名、-edオプションはデータベースに対するキャッシング(SQL cache dependency)の有効化、-edオプションはテーブルに対するキャッシングの有効化を表す。

 なお、aspnet_regsql.exeを実行するに当たっては、あらかじめSQL Serverのデータベースに対象のテーブル(ここでは、wingsデータベースのmasterテーブル)を作成しておく必要がある。

 上記のコマンド実行の結果、以下のように表示されれば成功だ。

Enabling the database for SQL cache dependency.
.
Finished.
Enabling the table for SQL cache dependency.
Finished.
「aspnet_regsql.exe」の実行結果
この実行結果では、最初にデータベースに対してデータベース・キャッシング機能が有効になり、続いてテーブルに対して有効となっている。

○アプリケーション上でデータベース・キャッシングを有効化する

 次に、アプリケーションに対して、データベース・キャッシングを有効化する必要がある。これは、web.configに以下のような記述を追加していただきたい。

<connectionStrings>
  <add name="AppDb" connectionString="Server=(local);User ID=sa;Password=sa;Database=wings;Persist Security Info=True" providerName="System.Data.SqlClient" />
</connectionStrings>
  ……中略……
<caching>
  <sqlCacheDependency enabled="true" pollTime="1000">
    <databases>
      <add name="sample" connectionStringName="AppDb" />
    </databases>
  </sqlCacheDependency>
</caching>
アプリケーションに対するデータベース・キャッシングの有効化(web.config)

 <connectionStrings>要素は、接続文字列を宣言するための設定要素だ。ここでは、“AppDb”という名前でwingsデータベースへの接続文字列を宣言している。

 そして、データベース・キャッシングの具体的な内容を実際に規定しているのが、<caching>要素だ。配下の<sqlCacheDependency>要素でenable属性をtrueに設定することでデータベース・キャッシング機能が有効になる。

 また、pollTime属性はASP.NETが変更を検出するためのポーリング周期をミリ秒単位で設定するものだ。キャッシング対象となるデータベースは、配下の<databases>要素で定義することができる。<add>要素のname属性は、後から依存関係を設定するために必要となるキャッシュ名だ。またこの<add>要素のconnectionStringName属性によって、キャッシュ名と先ほど設定した接続文字列(<connectionStringName>要素)とを結び付けているわけである。

○データベース・キャッシングを利用する

 以上で、データベース・キャッシング機能を利用するための準備は完了だ。データベース・キャッシングが正常に動作していることを確認するために、以下のようなページを用意してみた。

 GridViewコントロールには、wingsデータベースのmasterテーブルから抽出したデータセットが連結してあるものとする(GridViewコントロールやデータソースに関する詳細は、本連載の第4回を参照いただきたい)。

データベース・キャッシング確認用のWebフォーム(dbcache.aspx)

 また、このWebフォーム(dbcache.aspx)をVisual Studio 2005のソース・モードで開いて、次のコード例のように@OutputCacheディレクティブとPage_Loadイベント・プロシージャを追記しておこう。Page_Loadイベント・プロシージャでは、dbcache.aspxに配置したラベル上に現在時刻を表示することとする。

<%@ OutputCache Duration="120" VaryByParam="none"
                SqlDependency="sample:master" %>
  …中略…
<script runat="server">
Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
  Label1.Text = DateTime.Now.ToString
End Sub
</script>
Webフォーム(dbcache.aspx)への@OutputCacheディレクティブとPage_Loadイベント・プロシージャの追記

 SqlDependency属性には「キャッシュ名:テーブル」の形式で依存関係にあるテーブルを指定することができる。ここでは、先ほど、web.configで設定した内容に基づいて「sample:master」と指定する。

 以上の設定ができたところで、さっそくdbcache.aspxを実行して、データベース・キャッシングが有効になっていることを確認してみよう。


 INDEX
  ASP.NET 2.0が変えるWebアプリ開発の世界
  第8回 新キャッシュ&コールバック機能でパフォーマンス改善
  1.「データベース・キャッシング」でキャッシング機能を強化
    2.<軽い>ポストバックを実現する「クライアント・コールバック」
    3.クライアント・コールバックを利用した例
 
インデックス・ページヘ  「ASP.NET 2.0が変えるWebアプリ開発の世界」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間