キャッシュオブジェクトクラスのコーディング
先ほど紹介したキャッシュユーティリティは有用ですが、それだけでは、実際の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を作成するために必要な情報(queryとconnection)、それをキャッシュに格納するために必要な情報(ttlSecondsとslidingSeconds)を渡すことができます。さらに、キャッシュの更新を「強制的に行う」ための引数(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ページを示します。
本稿のダウンロードサンプルには、このキャッシュライブラリを使用して、XMLドキュメント、カスタムオブジェクト、および簡単なArrayListコレクションを処理する例も含まれています。
まとめ
本稿では、さまざまなソース(データベースやディスクファイルなど)からのデータを簡単にキャッシュしたり、キャッシュ内のデータの有効期間を簡単に制御したりするために、ASP.NETのCacheクラスを使って簡単なユーティリティを作成しました。また、データとキャッシュにすばやく簡単にアクセスするためのヘルパーメソッドを作成しました。最後に、これらのヘルパークラスをASP.NET Webページ内で使用する方法の例を紹介しました。
ここではスペースの都合で、System.Web.Caching名前空間については詳しく説明しませんでした。本稿で紹介しているヘルパークラスの例は、ごく一部の可能性を示しているにすぎません。Caching名前空間のドキュメントを丹念に調べ、自分で少し実験をしてみれば、この簡単なサンプルコードを強力なユーティリティに拡張し、ASP.NETソリューションのパフォーマンスと柔軟性を高めることができるはずです。

