効率的なデータキャッシングでASP.NETのパフォーマンスを改善するはじめに 動的なコンテンツを使用するWebアプリケーションを扱ったことがある人なら誰でも、データアクセスが大きなボトルネックになり得ることをご存じでしょう。ASP.NETランタイムの優れた機能の1つに、 ASP.NETのデータキャッシングの基本ASP.NETのデータキャッシングでは、メモリ内にアプリケーション全体をスコープとするスレッドセーフな「バケツ」が用意され、そこに任意のシリアル化可能なオブジェクトやオブジェクトコレクションを格納することができます。この機能を利用して、負荷の高いデータベースクエリの結果や巨大なXMLドキュメント、さらには単純な配列や独自に設計したカスタムオブジェクトまで格納することができます。そうすれば、Webアプリケーションが稼働している間は、基のソースを毎回参照しなくても、このデータをキャッシュから呼び戻すことができます。しかも、データキャッシュには、キャッシュ内のアイテムの有効期間を設定できる機能があります。これを利用して、場合によっては、基になるデータが変更されたときにキャッシュを自動的に更新することができます。 そこで課題となるのは、この高性能のオブジェクトを、Webアプリケーション開発で使いやすいツールに変えることです。この記事では、この目的を実現するために、ASP.NETのデータキャッシングで最もよく使われる機能をカプセル化した1つのユーティリティクラスと、キャッシュのデータを挿入、更新、および再取得するためのショートカットを提供するヘルパークラスを作成します。 キャッシュユーティリティクラスの設計キャッシュされたアイテムを簡単に操作できるように、主要な機能をカプセル化した単純なクラスを用意することにします。このユーティリティクラスを使うことで、キャッシュ内のアイテムの読み出し、書き込み、列挙、および削除を簡略化します。次に示すのは、ユーティリティクラスに含まれるメソッドの一覧と、各メソッドに対応する引数です。 public static string ListCache() public static string ListCache(string mask) public static void ClearCache() public static void ClearCache(string mask) public static object GetCacheItem(string key) public static void DropCacheItem(string key) public static void SetCacheItem(string key, object data) public static void SetCacheItem(string key, object data, CacheDependency dependencies) public static void SetCacheItem(string key, object data, int seconds) public static void SetCacheItem(string key, object data, int seconds, int slidingSeconds) 有効期間のポリシーはもう少し複雑です。オブジェクトに有効期間(このクラスでは秒単位)を設定することができます。キャッシュ内のオブジェクトが有効期間を過ぎると、そのオブジェクトは自動的に削除されます。また、オブジェクトにアイドル時間(このクラスでは秒単位)を設定することもできます。オブジェクトがアイドル状態のまま、つまりどこからも要求されずに、指定した秒数が過ぎると、そのオブジェクトはキャッシュから削除されます。次に示すのは、有効期間とアイドル時間を処理する public static void SetCacheItem(string key, object data, int seconds, int slidingSeconds) { if(slidingSeconds>0) HttpContext.Current.Cache.Insert(key,data,null, System.DateTime.MaxValue,TimeSpan .FromSeconds(slidingSeconds)); else HttpContext.Current.Cache.Insert(key,data,null, System.DateTime.Now.AddSeconds(seconds), TimeSpan.FromSeconds(slidingSeconds)); } public static string ListCache(string filter) { StringBuilder sb = new StringBuilder(); string key=""; System.Collections.IDictionaryEnumerator en = HttpContext.Current.Cache.GetEnumerator(); while(en.MoveNext()) { key=en.Key.ToString(); if(filter.Length!=0 && key.IndexOf(filter)!=-1) sb.AppendFormat("{0}",key); if(filter.Length==0) sb.AppendFormat("{0}",key); } return sb.ToString(); } ここまでは、ASP.NETの キャッシュオブジェクトクラスのコーディング 先ほど紹介したキャッシュユーティリティは有用ですが、それだけでは、実際のWebアプリケーション内でのASP.NETの 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; } } おわかりのように、このメソッドには、キャッシュコレクションから 本稿のサンプルコードには、さまざまな目的で使用される、省略可能な引数リストを備えた他のヘルパーメソッドも含まれています。こうしたメソッドの一覧を次に示します。 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ページでテストするだけです。 キャッシュライブラリのテスト ライブラリをテストする簡単な方法は、 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(); } ご覧のように、ごくわずかなコードを追加するだけで、このキャッシュバージョンの 本稿のダウンロードサンプルには、このキャッシュライブラリを使用して、XMLドキュメント、カスタムオブジェクト、および簡単な まとめ 本稿では、さまざまなソース(データベースやディスクファイルなど)からのデータを簡単にキャッシュしたり、キャッシュ内のデータの有効期間を簡単に制御したりするために、ASP.NETの ここではスペースの都合で、 著者紹介Mike Amundsen(Mike Amundsen)
国際的に有名な著者兼講演者。米国やヨーロッパを股にかけ、ソフトウェア関連の幅広いトピックについて講演や講義を行っている。プログラミングを扱った著書多数。仕事を離れているときは、ケンタッキー州の自宅で妻と3人の子供と共に過ごしている。
関連記事 関連テーマ 最新トップニュース
|
|