連載
Enterprise Library概説

Windowsアプリケーションに高機能なキャッシュ機能を実装しよう

アバナード株式会社 市川 龍太(patterns & practices Champion
2006/10/14
Page1 Page2

CachingABが提供するキャッシュ機能

 最初にASP.NETキャッシュとCachingABの機能差異について見てみよう。それを表としてまとめたものが以下のものである。

機能 ASP.NETキャッシュ CachingAB
時間指定によるキャッシュ失効管理
ファイル依存によるキャッシュ失効管理
有効期限の自動スライド
非Webアプリケーションからの利用
   × ※1
キャッシュ・データの永続化
×
複数キャッシュの管理
×
外部構成ファイルによる構成管理
×
機能拡張の容易性
×
ASP.NETキャッシュとCachinABの機能比較
「時間指定によるキャッシュ失効管理」は前述の「任意の時間に応じてキャッシュ・データを更新・破棄する」に該当する機能。また、「ファイル依存によるキャッシュ失効管理」は前述の「依存関係にある外部ファイルが更新されたタイミングで、自動的にキャッシュ・データを更新・破棄する」に該当する機能だ。「有効期限の自動スライド」とは、ある一定の期間使用されなかったキャッシュ・データは破棄される機能である。
※1 EntLibのドキュメントにはHttpRuntimeを用いることによりWebアプリ以外でもASP.NETキャッシュを利用可能との記述があるが、あまり安全であるとはいえない。これについては「.NETエンタープライズ Webアプリケーション開発技術大全 vol2」の注釈欄(150ページの※59)にも記述が見られるため、参考にするとよいだろう。

 このようにCachingABは、ASP.NETキャッシュと比べて、キャッシュ・データの永続化、複数のキャッシュ管理など、より多くの機能を有している。次にこの表の中でCachingABのみが有している5つの機能について順に解説していくとしよう。

■非Webアプリケーションからの利用

 CachingABが利用できるのは何もWinアプリだけでなく、実際にはコンソール・アプリケーション、Windowsサービス、そしてWebアプリからも利用することができるのである。

 そもそも最初からASP.NETキャッシュを利用することが可能なWebアプリで、わざわざCachingABを利用する必要があるのか? という疑問を持たれるかもしれないが、先ほどの表に挙げた機能の中で、ASP.NETキャッシュでは提供されていない機能がWebアプリで必要になった場合は、CachingABの利用を考えるとよいだろう。

■キャッシュ・データの永続化

 ASP.NETキャッシュはキャッシュ・データをWebアプリのメモリ内で管理するため、永続化を行うことが不可能なのだが、CachingABは任意のデータベースや分離ストレージにキャッシュ・データを格納できるため、キャッシュ・データの永続化が可能になっている。キャッシュ・データをデータベースに格納する場合は、依存関係にあるData Access Application Blockを利用する。

 ちなみにこのキャッシュ・データの永続化は、あるシナリオにおいては不可欠な機能になる。それは複数クライアント、またはWebファーム構成においてキャッシュ・データを共有したい場合である。特にASP.NETキャッシュではアプリケーション・ドメインをまたいでキャッシュ・データを共有することが不可能なため、CachingABは非常に有効な選択肢となるだろう。

■複数キャッシュの管理

 ASP.NETキャッシュは1つのアプリケーション・ドメインに対して、単一のキャッシュを管理する機能しか提供できないのだが、CachingABは1つのアプリケーション・ドメインに対して複数のキャッシュを管理することが可能である。このことは、以下で示す「ASP.NETキャッシュのサンプル・プログラム」と「CachingABのサンプル・プログラム」を比較する分かりやすい。

public partial class Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    // 1つだけ
    string sampleData = "data";
    Cache.Insert("Key", sampleData);
  }

  protected void Button1_Click(object sender, EventArgs e)
  {
    this.Label1.Text = (string)Cache["Key"];
  }
}
ASP.NETキャッシュを利用したサンプル・プログラム
 
using Microsoft.Practices.EnterpriseLibrary.Caching;

public partial class Default : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    // 1つ目
    string sampleData = "data";
    CacheManager cache =
      CacheFactory.GetCacheManager("Cache Manager");
    cache.Add("Key", sampleData);

    // 2つ目
    string sampleData1 = "data1";
    CacheManager cache1 =
      CacheFactory.GetCacheManager("Cache Manager1");
    cache1.Add("Key", sampleData1);
  }

  protected void Button1_Click(object sender, EventArgs e)
  {
    CacheManager cache =
      CacheFactory.GetCacheManager("Cache Manager");
    this.Label1.Text = (string)cache["Key"];

    CacheManager cache1 =
      CacheFactory.GetCacheManager("Cache Manager1");
    this.Label2.Text = (string)cache1["Key"];
  }
}
CachingABを利用した複数のキャッシュ管理を利用したサンプル・プログラム
このサンプル・プログラムを利用するには事前に構成設定を行っておく必要があるが、それについては後述する

 ASP.NETキャッシュの場合は、キャッシュ・データを格納するInsertメソッドは静的メソッドであるため、同一キーに対して異なる複数の値を格納するようなことはできない。しかしCachingABは、まずCacheManagerオブジェクトを作成してからキャッシュ・データの格納を行うため、たとえ同一キーであってもCacheManagerオブジェクトが異なれば、異なる複数の値を管理することが可能なのである。

■外部構成ファイルによる構成管理

 CachingABも、ほかのApplication Block同様に、「The Enterprise Library Configuration Console」(以下Configurationコンソール)を利用することで、ソース・コードを変更することなく、その振る舞いを変更することが可能である。

■機能拡張の容易性

 CachingABはIBackingStoreインターフェイスを実装するか、BaseBackingStore抽象クラスを継承するカスタムBackingStoreクラスを作成することで、キャッシュ・データの格納先となるデータ・ストアを、任意のストア(ファイルなど)に変更することができる。

 さらにICacheItemExpirationインターフェイスやICacheItemRefreshActionインターフェイスを実装するカスタム・クラスを作成することで、キャッシュ・データを失効するポリシー(デフォルトはLRUルール)を任意のルールに変更することもできるようになっている。

 以上がCachingABのみが提供する機能である。それではCachingABの利用手順について順に解説していくとしよう。

ConfigurationコンソールでCachingABの構成を設定する

 今回は「アプリケーション」ノードに「Caching Application Block」ノードを追加する。具体的に手順は次の画面を参照してほしい。

ConfigurationコンソールでのCachingABの追加
Configurationコンソールを起動するには、[スタート]メニューの[プログラム]−[Microsoft patterns & practices]−[Enterprise Library - January 2006]−[Enterprise Library Configuration]をクリックすればよい。ここでは事前に、新規のアプリケーションを追加しておく必要がある。これを行うには、ツールバーの[New Application]をクリックするか、メニューバーから[File]−[New Application]を選択すればよい。これにより「Application Configuration」ノードがTreeViewコントロールのルートにある[Enterprise Library Configuration]ノードの直下に作成されるはずだ。
  CachingABを追加する。これを行うには、事前に新規追加しておいた「Application Configuration」ノードの上で右クリックしてコンテキスト・メニューを表示し、そこから[New]−[Caching Application Block]を選択すればよい。これにより「Caching Application Block」ノードが「Application Configuration」ノードの下に追加される。
  今回のサンプル・プログラムはインメモリでキャッシュするため、このままで問題ない。これを例えば任意のデータベース内でキャッシュ・データを管理したい場合には、さらに「Cache Manager」ノードの上で右クリックしてコンテキスト・メニューを表示し、そこから[New]−[Database Cache Storage]を選択すればよい。これによりData Access Application Blockも同時に追加される。

■「Caching Application Block」配下の各ノードにおけるプロパティ設定

 以下の表は、上記の各ノードの各プロパティの設定例である。

プロパティ
設定値
Caching Application Block DefaultCacheManager Cache Manager
Name Caching Application Block
Cache Managers Name Cache Managers
Cache Manager ExpirationPollFrequencyInSeconds 60
MaximumElementsInCacheBeforeScavenging 1
Name Cache Manager
NumberToRemoveWhenScavenging 1
CachingAB配下の各ノードのプロパティ設定例
・ExpirationPollFrequencyInSecondsは、データ失効条件をチェックする頻度を秒単位で設定する
・MaximumElementsInCacheBeforeScavengingに設定した値を超えたデータ数をキャッシュするとデータ失効(スカベンジング)処理が発生する
・NumberToRemoveWhenScavengingは、データ失効処理が発生したときに、キャッシュから削除されるデータ数を設定する表中の太字の個所がデフォルト設定から変更した設定値である。ここでは次のサンプル・プログラムで示す実例のために、MaximumElementsInCacheBeforeScavengingとNumberToRemoveWhenScavengingを1にしている。

■キャッシュ処理を実行する

 ここではCachingABを利用するアプリケーションとして、ボタンを2つとラベルを2つ配置したWindowsアプリケーションを作成する。

 このサンプル・プログラムでは、まず起動時にキャッシュ・データを1つ追加し、さらに[button1]ボタンクリックを押下することで2つ目のキャッシュ・データを登録する。その後[button2]ボタン押下することによって起動時に登録されたキャッシュ・データを削除する。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using Microsoft.Practices.EnterpriseLibrary.Caching;

namespace CachingABSample
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();

      string sampleData = "data";
      CacheManager cache =
        CacheFactory.GetCacheManager("Cache Manager");
      cache.Add("Key", sampleData);
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string sampleData1 = "data1";
      CacheManager cache =
        CacheFactory.GetCacheManager("Cache Manager");
      cache.Add("Key1", sampleData1);
    }

    private void button2_Click(object sender, EventArgs e)
    {
      CacheManager cache =
        CacheFactory.GetCacheManager("Cache Manager");
      this.label1.Text = (string)cache["Key"];

      CacheManager cache1 =
        CacheFactory.GetCacheManager("Cache Manager");
      this.label2.Text = (string)cache1["Key1"];
    }
  }
}
CachingABを活用してキャッシングを行うサンプル・プログラム(C#)
このサンプル・プログラムを実行するには、以下のアセンブリを参照設定に追加する必要がある。
・Microsoft.Practices.EnterpriseLibrary.Caching.dll

 このサンプル・プログラムを起動した後で[button1]ボタンを押下し、続いて[button2]ボタンを押下すると、Configurationコンソールで設定したとおり、起動時に登録されたキャッシュ・データだけが削除されていることが確認できるだろう(つまりcache["Key"]はnullを返し、cache["Key1"]は「data1」を返す)。

 以上、今回はCachingABを用いたキャッシュ処理について解説した。大事なことなので繰り返すが、そもそも特定のデータをキャッシュする前に、まずそのデータが本当にキャッシュするべきデータであるかどうかの判断と、どのようにキャッシュされたデータを管理・運用していくのかが非常に重要になる。この判断を誤ると単にパフォーマンスを悪化させるだけでなく、システム・テスト以降、時には運用時になって初めて発覚するような致命的なバグを埋め込んでしまうことにもなりかねないだけに、キャッシュするデータの判断は慎重に行うことが大切である。

 2005年1月にEnterprise Library 1.0がリリースされて以来、9回に渡って続いた本連載も今回のCachingABを持ってすべてのApplication Blockを紹介し終わったことになる。その間EntLib 1.1、そしてEntLib 2.0がリリースされ、さらに来るべき.NET Framework 3.0へ対応すべく、現在EntLib 3.0の準備が着々と進められている。

 次回は本連載の総括として「今後のEntLibの展望」と、さらに『patterns & practicesが掲げるSoftware Factoryの具体像』と題してComposite UI Application Block、Guidance Automation Toolkit、そしてSmart Client Software Factory, Web Client Software Factoryについての概要を解説する予定である。ご期待いただきたい。End of Article


 INDEX
  連載:Enterprise Library概説
  Windowsアプリケーションに高機能なキャッシュ機能を実装しよう
    1.ASP.NETが提供するキャッシュ機能
  2.CachingABが提供するキャッシュ機能
 
インデックス・ページヘ  「Enterprise Library概説」


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 記事ランキング

本日 月間