SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

効率的なデータキャッシングでASP.NETのパフォーマンスを改善する

Cacheクラスの扱いを簡便化するユーティリティ/ヘルパークラスの作成

キャッシュオブジェクトクラスのコーディング

 先ほど紹介したキャッシュユーティリティは有用ですが、それだけでは、実際のWebアプリケーション内でのASP.NETのCacheクラスの扱いが大幅に簡便化されるわけではありません。そこで、よく使われるデータオブジェクトのキャッシングを実現するもう1つのクラス(ヘルパークラス)が必要になります。このヘルパークラスには、たとえば、キャッシュされたDataSetやXMLドキュメントを容易に操作できるようにするメソッドを用意します。次のコードは、キャッシュされたDataSetオブジェクトを操作するためのメソッドです。

public DataSet GetSqlDataSet(string key, string connection,
   string query, bool refresh, int ttlSeconds, int idleSeconds)
{
   DataSet ds = null;

   try
   {
      if(refresh==false)
         ds = (DataSet)CacheUtility.GetCacheItem(key);
   }
   catch {}

   if(ds == null)
   {
      try
      {
         ds = new DataSet();
         SqlDataAdapter da = new SqlDataAdapter(query,connection);
         da.Fill(ds);
      }
      catch (Exception ex)
      {
         throw new ApplicationException("GetSqlDataSet failed.",ex);
      }

   if(idleSeconds>0 && ttlSeconds>0)
      CacheUtility.SetCacheItem(key,ds,ttlSeconds,idleSeconds);
   if(idleSeconds<1 && ttlSeconds>0)
      CacheUtility.SetCacheItem(key,ds,ttlSeconds);
   else
      CacheUtility.SetCacheItem(key,ds);
   }
   return ds;
   }
}

 おわかりのように、このメソッドには、キャッシュコレクションからDataSetを取得するために必要な情報(key)に加え、DataSetを作成するために必要な情報(queryconnection)、それをキャッシュに格納するために必要な情報(ttlSecondsslidingSeconds)を渡すことができます。さらに、キャッシュの更新を「強制的に行う」ための引数(refresh)もあります。このメソッドをコードで初めて使用すると、メソッドはキャッシュにアイテムがないことを検出し、データベースクエリを実行してDataSetにデータを取り込み、そのDataSetを後から利用できるようにキャッシュに配置します。それ以降の呼び出しでは、有効期間またはアイドル時間が経過するまで、常にアイテムがキャッシュから返されます。それを過ぎると、データがデータベースから取得され、再びキャッシュに配置されます。

 本稿のサンプルコードには、さまざまな目的で使用される、省略可能な引数リストを備えた他のヘルパーメソッドも含まれています。こうしたメソッドの一覧を次に示します。

public DataSet GetSqlDataSet(string key, string connection,
   string query)
public DataSet GetSqlDataSet(string key, string connection,
   string query, bool refresh)
public DataSet GetSqlDataSet(string key, string connection,
   string query, bool refresh, int ttlSeconds)
public DataSet GetSqlDataSet(string key, string connection,
   string query, bool refresh, int ttlSeconds, int idleSeconds)

public DataSet GetXmlDataSet(string key, string filename)
public DataSet GetXmlDataSet(string key, string filename,
   bool refresh)
public DataSet GetXmlDataSet(string key, string filename,
   bool refresh, bool depends)

public XmlDocument GetXmlDocument(string key, string url)
public XmlDocument GetXmlDocument(string key, string url,
   bool refresh)
public XmlDocument GetXmlDocument(string key, string url,
   bool refresh, int ttlSeconds)
public XmlDocument GetXmlDocument(string key, string url,
   bool refresh, int ttlSeconds, int idleSeconds)

public XslTransform GetXslTransform(string key, string url)
public XslTransform GetXslTransform(string key, string url,
   bool refresh)
public XslTransform GetXslTransform(string key, string url,
   bool refresh, int ttlSeconds)
public XslTransform GetXslTransform(string key, string url,
   bool refresh, int ttlSeconds, int idleSeconds)

 後は、このクラスライブラリをASP.NET Webページでテストするだけです。

キャッシュライブラリのテスト

 ライブラリをテストする簡単な方法は、DataSetの結果を表示するASP.NET Webページを作成することです。次のコードは、ボタンがクリックされたときにpubsデータベースのデータをDBグリッドに表示するよう要求するイベントハンドラを示しています。

void btnGetData_OnClick(object sender, EventArgs args)
{
   CacheObjects co = new CacheObjects();
   bool refresh = cbxRefresh.Checked;
   int ttlSeconds = Int32.Parse(txtTTLSeconds.Text);
   int slidingSeconds = Int32.Parse(txtSlidingSeconds.Text);
   DataSet ds = co.GetSqlDataSet(key,connection,query,
      refresh,ttlSeconds,slidingSeconds);
   dgAuthors.DataSource = ds;
   dgAuthors.DataBind();
}

 ご覧のように、ごくわずかなコードを追加するだけで、このキャッシュバージョンのDataSetオブジェクトを使うことができます。図1に、結果のWebページを示します。

図1:DataSetの結果が表示されたASP.NET Webページ
図1:DataSetの結果が表示されたASP.NET Webページ

 本稿のダウンロードサンプルには、このキャッシュライブラリを使用して、XMLドキュメント、カスタムオブジェクト、および簡単なArrayListコレクションを処理する例も含まれています。

まとめ

 本稿では、さまざまなソース(データベースやディスクファイルなど)からのデータを簡単にキャッシュしたり、キャッシュ内のデータの有効期間を簡単に制御したりするために、ASP.NETのCacheクラスを使って簡単なユーティリティを作成しました。また、データとキャッシュにすばやく簡単にアクセスするためのヘルパーメソッドを作成しました。最後に、これらのヘルパークラスをASP.NET Webページ内で使用する方法の例を紹介しました。

 ここではスペースの都合で、System.Web.Caching名前空間については詳しく説明しませんでした。本稿で紹介しているヘルパークラスの例は、ごく一部の可能性を示しているにすぎません。Caching名前空間のドキュメントを丹念に調べ、自分で少し実験をしてみれば、この簡単なサンプルコードを強力なユーティリティに拡張し、ASP.NETソリューションのパフォーマンスと柔軟性を高めることができるはずです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Mike Amundsen(Mike Amundsen)

国際的に有名な著者兼講演者。米国やヨーロッパを股にかけ、ソフトウェア関連の幅広いトピックについて講演や講義を行っている。プログラミングを扱った著書多数。仕事を離れているときは、ケンタッキー州の自宅で妻と3人の子供と共に過ごしている。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/229 2006/04/11 19:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー