Share via


ObjectDataSource でデータをキャッシュする (C#)

作成者: Scott Mitchell

PDF のダウンロード

キャッシュは、低速 Web アプリケーションと高速 Web アプリケーションの違いを意味する可能性があります。 このチュートリアルは、ASP.NET でのキャッシュについて詳しく説明する 4 つのチュートリアルの 1 つ目です。 キャッシュの主な概念と、ObjectDataSource コントロールを使用してプレゼンテーション レイヤーにキャッシュを適用する方法について説明します。

はじめに

コンピューター サイエンスでは、 キャッシュ とは、取得にコストがかかるデータまたは情報を取得し、アクセスが速い場所にコピーを格納するプロセスです。 データ ドリブン アプリケーションの場合、大規模で複雑なクエリでは、通常、アプリケーションの実行時間の大部分が消費されます。 このようなアプリケーションのパフォーマンスは、多くの場合、負荷の高いデータベース クエリの結果をアプリケーションのメモリに格納することで改善できます。

ASP.NET 2.0 には、さまざまなキャッシュ オプションが用意されています。 Web ページ全体またはユーザー コントロールでレンダリングされたマークアップは、 出力キャッシュを使用してキャッシュできます。 ObjectDataSource コントロールと SqlDataSource コントロールは、キャッシュ機能も提供するため、コントロール レベルでデータをキャッシュできます。 また、ASP.NET のデータ キャッシュ には、ページ開発者がプログラムでオブジェクトをキャッシュできるようにするリッチ キャッシュ API が用意されています。 このチュートリアルと次の 3 つでは、ObjectDataSource のキャッシュ機能とデータ キャッシュの使用について説明します。 また、起動時にアプリケーション全体のデータをキャッシュする方法と、SQL キャッシュの依存関係を使用してキャッシュされたデータを最新の状態に保つ方法についても説明します。 これらのチュートリアルでは、出力キャッシュについては説明しません。 出力キャッシュの詳細については、「 ASP.NET 2.0 の出力キャッシュ」を参照してください。

キャッシュは、データ アクセス層からプレゼンテーション層まで、アーキテクチャ内の任意の場所に適用できます。 このチュートリアルでは、ObjectDataSource コントロールを使用してプレゼンテーション レイヤーにキャッシュを適用する方法について説明します。 次のチュートリアルでは、ビジネス ロジック レイヤーでのデータのキャッシュについて説明します。

キー キャッシュの概念

キャッシュを使用すると、生成にコストがかかるデータを取得し、より効率的にアクセスできる場所にコピーを格納することで、アプリケーションの全体的なパフォーマンスとスケーラビリティを大幅に向上させることができます。 キャッシュは実際の基になるデータのコピーのみを保持するため、基になるデータが変更されると古くなったり、 古くなったりする可能性があります。 これに対処するために、ページ開発者は、次のいずれかを使用して、キャッシュ項目をキャッシュから 削除 する基準を示すことができます。

  • 時間ベースの条件 項目は、絶対またはスライディング期間のためにキャッシュに追加できます。 たとえば、ページ開発者は、たとえば 60 秒の期間を示します。 絶対継続時間では、キャッシュされた項目は、アクセスの頻度に関係なく、キャッシュに追加されてから 60 秒後に削除されます。 スライディング期間では、キャッシュされた項目は最後のアクセスから 60 秒後に削除されます。
  • 依存関係ベースの条件 は、依存関係をキャッシュに追加するときに項目に関連付けることができます。 項目の依存関係が変更されると、キャッシュから削除されます。 依存関係には、ファイル、別のキャッシュ 項目、または 2 つの組み合わせがあります。 ASP.NET 2.0 では、SQL キャッシュの依存関係も許可されます。これにより、開発者はキャッシュに項目を追加し、基になるデータベース データが変更されたときに削除できます。 SQL キャッシュの依存関係については、今後の SQL キャッシュ依存関係の使用に関 するチュートリアルを参照してください。

指定された削除条件に関係なく、時間ベースまたは依存関係ベースの条件が満たされる前に、キャッシュ内の項目が 清掃 される可能性があります。 キャッシュが容量に達した場合は、新しい項目を追加する前に既存の項目を削除する必要があります。 そのため、キャッシュされたデータをプログラムで操作する場合は、キャッシュされたデータが存在しない可能性があることを常に想定することが重要です。 次のチュートリアル「アーキテクチャでのデータのキャッシュ」では、プログラムでキャッシュからデータにアクセスするときに使用するパターン について説明します

キャッシュは、アプリケーションからより多くのパフォーマンスを絞り込む経済的な手段を提供します。 スティーブン・スミスが「キャッシュ: テクニックとベスト プラクティス ASP.NET」の記事で説明しています。

キャッシュは、多くの時間と分析を必要とせずに十分なパフォーマンスを得るための優れた方法です。 メモリは安価であるため、コードやデータベースを最適化するために 1 日または 1 週間を費やす代わりに 30 秒間出力をキャッシュすることで必要なパフォーマンスを得ることができる場合は、キャッシュ ソリューションを実行して (30 秒の古いデータが問題ない場合)、次に進みます。 最終的には、設計が不十分になる可能性があるため、もちろん、アプリケーションを正しく設計する必要があります。 しかし、今すぐ十分なパフォーマンスを得る必要がある場合は、キャッシュが優れた[アプローチ]になり、後日アプリケーションをリファクタリングする時間が必要になります。

キャッシュによってパフォーマンスが大幅に向上する可能性はありますが、リアルタイムで頻繁に更新されるデータを使用するアプリケーションや、有効期間が短い古いデータであっても受け入れられない場合など、すべての状況で適用できるわけではありません。 ただし、ほとんどのアプリケーションでは、キャッシュを使用する必要があります。 ASP.NET 2.0 でのキャッシュの詳細については、「ASP.NET 2.0 クイックスタート チュートリアル」の「パフォーマンスのキャッシュ」セクションを参照してください。

手順 1: キャッシュ Web ページの作成

ObjectDataSource のキャッシュ機能の探索を開始する前に、まず、このチュートリアルと次の 3 つのために必要な ASP.NET ページを Web サイト プロジェクトに作成します。 まず、 という名前 Cachingの新しいフォルダーを追加します。 次に、次の ASP.NET ページをそのフォルダーに追加し、各ページをマスター ページに Site.master 関連付けます。

  • Default.aspx
  • ObjectDataSource.aspx
  • FromTheArchitecture.aspx
  • AtApplicationStartup.aspx
  • SqlCacheDependencies.aspx

Caching-Related チュートリアルの ASP.NET ページを追加する

図 1: Caching-Related チュートリアルの ASP.NET ページを追加する

他のフォルダーと同様に、 Default.aspx フォルダーには Caching セクションにチュートリアルが一覧表示されます。 ユーザー コントロールに SectionLevelTutorialListing.ascx この機能があることを思い出してください。 したがって、このユーザー コントロールを にDefault.aspx追加するには、ソリューション エクスプローラーからページのデザイン ビューにドラッグします。

図 2: SectionLevelTutorialListing.ascx ユーザー コントロールをDefault.aspxに追加する

図 2: 図 2: ユーザー コントロールを SectionLevelTutorialListing.ascx に追加する Default.aspx (クリックするとフルサイズの画像が表示されます)

最後に、これらのページをエントリとしてファイルに追加します Web.sitemap 。 具体的には、バイナリ データの操作の後に次のマークアップを追加します <siteMapNode>

<siteMapNode title="Caching" url="~/Caching/Default.aspx" 
    description="Learn how to use the caching features of ASP.NET 2.0.">
    <siteMapNode url="~/Caching/ObjectDataSource.aspx" 
        title="ObjectDataSource Caching" 
        description="Explore how to cache data directly from the 
            ObjectDataSource control." />
    <siteMapNode url="~/Caching/FromTheArchitecture.aspx" 
        title="Caching in the Architecture" 
        description="See how to cache data from within the 
            architecture." />
    <siteMapNode url="~/Caching/AtApplicationStartup.aspx" 
        title="Caching Data at Application Startup" 
        description="Learn how to cache expensive or infrequently-changing 
            queries at the start of the application." />
    <siteMapNode url="~/Caching/SqlCacheDependencies.aspx" 
        title="Using SQL Cache Dependencies" 
        description="Examine how to have data automatically expire from the 
            cache when its underlying database data is modified." />
</siteMapNode>

を更新した Web.sitemap後、ブラウザーを使用してチュートリアル Web サイトを表示します。 左側のメニューに、キャッシュ チュートリアルの項目が含まれるようになりました。

サイト マップにキャッシュ チュートリアルのエントリが含まれるようになりました

図 3: サイト マップにキャッシュ チュートリアルのエントリが含まれるようになりました

手順 2: Web ページに製品の一覧を表示する

このチュートリアルでは、ObjectDataSource コントロールの組み込みのキャッシュ機能を使用する方法について説明します。 ただし、これらの機能を見る前に、最初にページを操作する必要があります。 GridView を使用して、 クラスから ObjectDataSource によって取得された製品情報を一覧表示する Web ページを ProductsBLL 作成してみましょう。

まず、フォルダー内の ObjectDataSource.aspx ページを Caching 開きます。 GridView をツールボックスからDesignerにドラッグし、そのプロパティを IDProducts設定し、スマート タグから という名前ProductsDataSourceの新しい ObjectDataSource コントロールにバインドすることを選択します。 クラスを操作するように ObjectDataSource を ProductsBLL 構成します。

ProductsBLL クラスを使用するように ObjectDataSource を構成する

図 4: クラスを使用するように ObjectDataSource を構成する ProductsBLL (クリックするとフルサイズの画像が表示されます)

このページでは、編集可能な GridView を作成して、ObjectDataSource にキャッシュされたデータが GridView インターフェイスを介して変更された場合の動作を確認できるようにします。 [選択] タブのドロップダウン リストは既定の に設定したままにしますが、[更新] タブで選択した項目を、GetProducts()入力パラメーターとして 、unitPrice、および productID を受け入れるproductNameオーバーロードにUpdateProduct変更します。

UPDATE タブの Drop-Down リストを適切な UpdateProduct オーバーロードに設定する

図 5: UPDATE タブの Drop-Down リストを適切な UpdateProduct オーバーロードに設定する (フルサイズの画像を表示する をクリックします)

最後に、[INSERT] タブと [DELETE] タブのドロップダウン リストを [(なし)] に設定し、[完了] をクリックします。 データ ソースの構成ウィザードが完了すると、Visual Studio によって ObjectDataSource の プロパティが OldValuesParameterFormatStringoriginal_{0}設定されます。 「 データの挿入、更新、および削除の概要 」チュートリアルで説明したように、更新ワークフローをエラーなしで続行するには、このプロパティを宣言構文から削除するか、 {0}既定値である に戻す必要があります。

さらに、ウィザードが完了すると、Visual Studio は各製品データ フィールドのフィールドを GridView に追加します。 、CategoryNameProductNameおよび UnitPrice BoundField を除くすべてを削除します。 次に HeaderText 、これらの BoundFields の各プロパティをそれぞれ Product、Category、Price に更新します。 フィールドは ProductName 必須であるため、BoundField を TemplateField に変換し、RequiredFieldValidator を に追加します EditItemTemplate。 同様に、BoundField を UnitPrice TemplateField に変換し、CompareValidator を追加して、ユーザーが入力した値が 0 以上の有効な通貨値であることを確認します。 これらの変更に加えて、値の右揃え UnitPrice や、読み取り専用および編集インターフェイスでのテキストの書式設定 UnitPrice の指定など、美的な変更を自由に実行できます。

GridView のスマート タグの [編集を有効にする] チェック ボックスをオンにして、GridView を編集可能にします。 [ページングを有効にする] チェック ボックスと [並べ替えを有効にする] チェック ボックスもチェックします。

注意

GridView の編集インターフェイスをカスタマイズする方法のレビューが必要ですか? その場合は、 データ変更インターフェイスのカスタマイズ に関するチュートリアルを参照してください。

GridView での編集、並べ替え、ページングのサポートを有効にする

図 6: GridView の編集、並べ替え、ページングのサポートを有効にする (フルサイズの画像を表示する をクリックします)

これらの GridView の変更を行った後、GridView と ObjectDataSource の宣言型マークアップは次のようになります。

<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="ProductID" DataSourceID="ProductsDataSource" 
    AllowPaging="True" AllowSorting="True">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:TemplateField HeaderText="Product" SortExpression="ProductName">
            <EditItemTemplate>
                <asp:TextBox ID="ProductName" runat="server" 
                    Text='<%# Bind("ProductName") %>'></asp:TextBox>
                <asp:RequiredFieldValidator 
                    ID="RequiredFieldValidator1" Display="Dynamic" 
                    ControlToValidate="ProductName" SetFocusOnError="True"
                    ErrorMessage="You must provide a name for the product."
                    runat="server">*</asp:RequiredFieldValidator>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" 
                    Text='<%# Bind("ProductName") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="CategoryName" HeaderText="Category" 
            ReadOnly="True" SortExpression="CategoryName" />
        <asp:TemplateField HeaderText="Price" SortExpression="UnitPrice">
            <EditItemTemplate>
                $<asp:TextBox ID="UnitPrice" runat="server" Columns="8" 
                    Text='<%# Bind("UnitPrice", "{0:N2}") %>'></asp:TextBox>
                <asp:CompareValidator ID="CompareValidator1"
                    ControlToValidate="UnitPrice" Display="Dynamic" 
                    ErrorMessage="You must enter a valid currency value with no 
                        currency symbols. Also, the value must be greater than 
                        or equal to zero."
                    Operator="GreaterThanEqual" SetFocusOnError="True" 
                    Type="Currency" runat="server" 
                    ValueToCompare="0">*</asp:CompareValidator>
            </EditItemTemplate>
            <ItemStyle HorizontalAlign="Right" />
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" 
                    Text='<%# Bind("UnitPrice", "{0:c}") %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
    OldValuesParameterFormatString="{0}" SelectMethod="GetProducts" 
    TypeName="ProductsBLL" UpdateMethod="UpdateProduct">
    <UpdateParameters>
        <asp:Parameter Name="productName" Type="String" />
        <asp:Parameter Name="unitPrice" Type="Decimal" />
        <asp:Parameter Name="productID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

図 7 に示すように、編集可能な GridView には、データベース内の各製品の名前、カテゴリ、価格が一覧表示されます。 ページの機能をテストして、結果の並べ替え、ページの並べ替え、レコードの編集を行います。

各製品の名前、カテゴリ、および価格は、並べ替え可能、ページング可能、編集可能な GridView に一覧表示されます

図 7: 各製品の名前、カテゴリ、および価格が並べ替え可能、ページング可能、編集可能な GridView に一覧表示されている (フルサイズの画像を表示する をクリックします)

手順 3: ObjectDataSource がデータを要求しているタイミングを調べる

GridView は Products 、ObjectDataSource の メソッドを Select 呼び出して、表示するデータを ProductsDataSource 取得します。 この ObjectDataSource は、ビジネス ロジック レイヤーの ProductsBLL クラスのインスタンスを作成し、そのメソッドをGetProducts()呼び出します。これにより、データ アクセス層の メソッドがProductsTableAdapterGetProducts()呼び出されます。 DAL メソッドは Northwind データベースに接続し、構成された SELECT クエリを発行します。 このデータは DAL に返され、 に NorthwindDataTableパッケージ化されます。 DataTable オブジェクトは BLL に返され、ObjectDataSource に返され、GridView に返されます。 その後、GridView は DataTable 内のそれぞれの DataRow オブジェクトを作成GridViewRowし、最終的にクライアントGridViewRowに返され、訪問者のブラウザーに表示される HTML にレンダリングされます。

この一連のイベントは、GridView が基になるデータにバインドする必要があるたびに発生します。 これは、ページが最初にアクセスされたとき、あるページから別のページに移動するとき、GridView を並べ替えるとき、または組み込みの編集または削除インターフェイスを使用して GridView のデータを変更するときに発生します。 GridView のビューステートが無効になっている場合、GridView は各ポストバックでもリバウンドされます。 GridView は、そのメソッドを呼び出 DataBind() すことによって、データに明示的にリバウンドすることもできます。

データベースからデータを取得する頻度を十分に理解するために、データが再取得されるタイミングを示すメッセージを表示してみましょう。 という名前 ODSEventsの GridView の上に Label Web コントロールを追加します。 そのプロパティを Text クリアし、そのプロパティを EnableViewStatefalse設定します。 Label の下に Button Web コントロールを追加し、そのプロパティを Text Postback に設定します。

GridView の上のページにラベルとボタンを追加する

図 8: GridView の上のページにラベルとボタンを追加する (フルサイズの画像を表示する をクリックします)

データ アクセス ワークフロー中、ObjectDataSource イベント Selecting は、基になるオブジェクトが作成され、構成されたメソッドが呼び出される前に発生します。 このイベントのイベント ハンドラーを作成し、次のコードを追加します。

protected void ProductsDataSource_Selecting(object sender, 
    ObjectDataSourceSelectingEventArgs e)
{
    ODSEvents.Text = "-- Selecting event fired";
}

ObjectDataSource がデータのアーキテクチャに対して要求を行うたびに、Label に Selecting イベントが発生したというテキストが表示されます。

ブラウザーでこのページにアクセスします。 ページが最初にアクセスされると、Selecting イベントが発生したというテキストが表示されます。 [ポストバック] ボタンをクリックし、テキストが表示されなくなることに注意してください (GridView の EnableViewState プロパティが既定値の に true設定されている場合)。 これは、ポストバック時に GridView がそのビュー ステートから再構築されるため、データの ObjectDataSource に変換されないためです。 ただし、データの並べ替え、ページング、または編集を行うと、GridView がデータ ソースに再バインドされるため、Selecting イベントが発生したテキストが再び表示されます。

GridView がデータ ソースに再バインドされるたびに、発生したイベントの選択が表示されます

図 9: GridView がデータ ソースに再バインドされるたびに、発生したイベントの選択が表示されます (フルサイズの画像を表示する をクリックします)。

ポストバック ボタンをクリックすると、GridView がビューステートから再構築されます

図 10: ポストバック ボタンをクリックすると、GridView がビューステートから再構築されます (フルサイズの画像を表示する場合はクリックします)

データがページングまたは並べ替えられるたびにデータベース データを取得するのは無駄に思える場合があります。 結局のところ、既定のページングを使用しているため、ObjectDataSource は最初のページを表示するときにすべてのレコードを取得しました。 GridView で並べ替えとページングのサポートが提供されない場合でも、ページが最初にユーザーによってアクセスされるたびに (ビュー ステートが無効になっている場合は、すべてのポストバックで) データをデータベースから取得する必要があります。 ただし、GridView がすべてのユーザーに同じデータを表示している場合、これらの追加のデータベース要求は余分です。 メソッドから返された結果をキャッシュし GetProducts() 、GridView をキャッシュされた結果にバインドしてみませんか?

手順 4: ObjectDataSource を使用してデータをキャッシュする

いくつかのプロパティを設定するだけで、取得したデータを ASP.NET データ キャッシュに自動的にキャッシュするように ObjectDataSource を構成できます。 次の一覧は、ObjectDataSource のキャッシュ関連のプロパティをまとめたものです。

  • キャッシュを有効にするには、EnableCaching を に true 設定する必要があります。 既定値は、false です。
  • CacheDuration データがキャッシュされる時間 (秒単位)。 既定値は 0 です。 ObjectDataSource は、 が でtrueCacheDuration、0 より大きい値に設定されている場合EnableCachingにのみデータをキャッシュします。
  • CacheExpirationPolicy は または SlidingAbsolute設定できます。 の場合 Absolute、ObjectDataSource は、取得したデータを秒単位で CacheDuration キャッシュします。の場合 Sliding、データの有効期限は、秒のアクセス CacheDuration が行われなかった後に限られます。 既定では、 Absoluteです。
  • CacheKeyDependency では、このプロパティを使用して、ObjectDataSource のキャッシュ エントリを既存のキャッシュ依存関係に関連付けます。 ObjectDataSource のデータ エントリは、関連付けられている CacheKeyDependencyの有効期限が切れてキャッシュから途中で削除される可能性があります。 このプロパティは、SQL キャッシュの依存関係を ObjectDataSource のキャッシュに関連付けるために最も一般的に使用されます。これについては、SQL キャッシュ依存関係の使用 に関するチュートリアルで今後説明するトピックです。

ObjectDataSource を ProductsDataSource 構成して、データを絶対スケールで 30 秒間キャッシュします。 ObjectDataSource の EnableCaching プロパティを に true 設定し、その CacheDuration プロパティを 30 に設定します。 プロパティは既定AbsoluteCacheExpirationPolicy に設定したままにします。

Data を 30 秒間キャッシュするように ObjectDataSource を構成する

図 11: 30 秒間データをキャッシュするように ObjectDataSource を構成する (フルサイズの画像を表示する をクリックします)

変更内容を保存し、ブラウザーでこのページを再表示します。 Selecting イベントが発生したテキストは、最初にデータがキャッシュに入っていないので、ページに初めてアクセスしたときに表示されます。 ただし、[ポストバック] ボタンのクリック、並べ替え、ページング、または [編集] ボタンまたは [キャンセル] ボタンのクリックによってトリガーされる後続のポストバックでは、Selecting イベントが発生したテキストは再表示 されません 。 これは、 Selecting ObjectDataSource が基になるオブジェクトからデータを取得した場合にのみイベントが発生するためです。データが Selecting データ キャッシュからプルされた場合、イベントは発生しません。

30 秒後、データはキャッシュから削除されます。 ObjectDataSource の InsertUpdate、または Delete メソッドが呼び出されると、データもキャッシュから削除されます。 したがって、30 秒が経過するか、[更新] ボタンがクリック、並べ替え、ページング、または [編集] ボタンまたは [キャンセル] ボタンをクリックすると、ObjectDataSource は基になるオブジェクトからデータを取得し、イベントが発生したときに Selecting Selecting イベントが発生したテキストを表示します。 これらの返された結果は、データ キャッシュに戻されます。

注意

Selecting イベントが発生したテキストが頻繁に表示される場合は、ObjectDataSource がキャッシュされたデータを操作することが予想される場合でも、メモリの制約が原因である可能性があります。 空きメモリが不足している場合は、ObjectDataSource によってキャッシュに追加されたデータが消去されている可能性があります。 ObjectDataSource がデータを正しくキャッシュしているように見えない場合、またはデータを散発的にキャッシュするだけの場合は、一部のアプリケーションを閉じてメモリを解放してからやり直してください。

図 12 は、ObjectDataSource のキャッシュ ワークフローを示しています。 Selecting イベントが発生したテキストが画面に表示されるのは、データがキャッシュに存在せず、基になるオブジェクトから取得する必要があったためです。 ただし、このテキストが見つからない場合は、データがキャッシュから使用できたためです。 キャッシュからデータが返されると、基になるオブジェクトの呼び出しがないため、データベース クエリは実行されません。

ObjectDataSource は、データ キャッシュからデータを格納および取得します

図 12: ObjectDataSource は、データ キャッシュからデータを格納および取得します

各 ASP.NET アプリケーションには、すべてのページと閲覧者で共有される独自のデータ キャッシュ インスタンスがあります。 つまり、ObjectDataSource によってデータ キャッシュに格納されているデータも、ページにアクセスするすべてのユーザー間で共有されます。 これを確認するには、ブラウザーでページを ObjectDataSource.aspx 開きます。 ページに初めてアクセスすると、Selecting イベントが発生したテキストが表示されます (以前のテストによってキャッシュに追加されたデータが削除されたと仮定します)。 2 番目のブラウザー インスタンスを開き、最初のブラウザー インスタンスから 2 番目のブラウザー インスタンスに URL をコピーして貼り付けます。 2 番目のブラウザー インスタンスでは、Selecting イベントが発生したテキストは、最初のと同じキャッシュされたデータを使用しているため、表示されません。

取得したデータをキャッシュに挿入する場合、ObjectDataSource は、プロパティ値と CacheExpirationPolicy プロパティ値、ObjectDataSource によって使用される基になるビジネス オブジェクトの型 (ProductsBLLこの例では) 、プロパティの値、TypeNameコレクション内SelectParametersのパラメーターのSelectMethod名前と値、および プロパティStartRowIndexMaximumRowsの値を含むCacheDurationキャッシュ キー値を使用します。 カスタム ページングを実装するときに使用されます。

これらのプロパティの組み合わせとしてキャッシュ キー値を作成すると、これらの値が変更されるにつれて一意のキャッシュ エントリが保証されます。 たとえば、過去のチュートリアルでは、 クラス s GetProductsByCategoryID(categoryID)を使用してProductsBLL、指定したカテゴリのすべての製品を返します。 1 人のユーザーがページに来て、1 の飲み物を CategoryID 表示する場合があります。 ObjectDataSource が値に関係 SelectParameters なく結果をキャッシュした場合、別のユーザーがページに来て、飲料製品がキャッシュに入っている間に、その飲み物の製品が表示されるのではなく、キャッシュされた飲料製品が表示されます。 の値 SelectParametersを含むこれらのプロパティによってキャッシュ キーを変更することで、ObjectDataSource は飲料とコンディメント用の個別のキャッシュ エントリを保持します。

古いデータに関する懸念事項

ObjectDataSource は、または Delete のいずれかのメソッドが呼び出されるとInsertUpdate、その項目をキャッシュから自動的に削除します。 これにより、ページを介してデータが変更されたときにキャッシュ エントリをクリアすることで、古いデータから保護できます。 ただし、キャッシュを使用している ObjectDataSource で古いデータを表示することはできます。 最も単純なケースでは、データベース内でデータが直接変更される可能性があります。 データベース管理者が、データベース内のレコードの一部を変更するスクリプトを実行しただけかもしれません。

このシナリオは、より微妙な方法で展開することもできます。 ObjectDataSource は、データ変更メソッドの 1 つが呼び出されたときにキャッシュから項目を削除しますが、削除されるキャッシュされた項目は、ObjectDataSource のプロパティ値の特定の組み合わせ (CacheDuration、、TypeNameSelectMethod、など) に対して行われます。 異なる SelectMethods または SelectParametersを使用する 2 つの ObjectDataSource があるが、同じデータを更新できる場合、1 つの ObjectDataSource が行を更新して独自のキャッシュ エントリを無効にすることができますが、2 番目の ObjectDataSource の対応する行はキャッシュから引き続き提供されます。 この機能を表示するページを作成することをお勧めします。 キャッシュを使用し、クラスの GetProducts() メソッドからデータを取得するように構成された ObjectDataSource からデータを取得する編集可能な GridView を表示するページをProductsBLL作成します。 別の編集可能な GridView と ObjectDataSource をこのページ (または別のページ) に追加しますが、この 2 番目の ObjectDataSource では メソッドを GetProductsByCategoryID(categoryID) 使用します。 2 つの ObjectDataSources プロパティは SelectMethod 異なるため、それぞれ独自のキャッシュ値を持ちます。 あるグリッドで製品を編集した場合、次回データを他のグリッドにバインドし直す場合 (ページング、並べ替えなどによって)、古いキャッシュされたデータは引き続き処理され、もう一方のグリッドから行われた変更は反映されません。

つまり、古いデータの可能性がある場合にのみ時間ベースの有効期限を使用し、データの鮮度が重要なシナリオでは有効期限を短くします。 古いデータが受け入れられない場合は、キャッシュを削除するか、SQL キャッシュの依存関係を使用します (キャッシュするデータベース データであると仮定)。 SQL キャッシュの依存関係については、今後のチュートリアルで説明します。

まとめ

このチュートリアルでは、ObjectDataSource の組み込みのキャッシュ機能について調べました。 いくつかのプロパティを設定するだけで、指定した SelectMethod から返された結果を ASP.NET データ キャッシュにキャッシュするように ObjectDataSource に指示できます。 プロパティと CacheExpirationPolicy プロパティはCacheDuration、アイテムがキャッシュされる期間と、アイテムが絶対有効期限かスライディング有効期限かを示します。 プロパティは CacheKeyDependency 、ObjectDataSource のすべてのキャッシュ エントリを既存のキャッシュ依存関係に関連付けます。 これは、時間ベースの有効期限に達する前に ObjectDataSource のエントリをキャッシュから削除するために使用でき、通常は SQL キャッシュの依存関係と共に使用されます。

ObjectDataSource は単にその値をデータ キャッシュにキャッシュするため、ObjectDataSource の組み込み機能をプログラムでレプリケートできます。 ObjectDataSource ではこの機能がすぐに使用できるため、プレゼンテーション レイヤーでこれを行っても意味はありませんが、アーキテクチャの別のレイヤーにキャッシュ機能を実装できます。 これを行うには、ObjectDataSource で使用されるのと同じロジックを繰り返す必要があります。 次のチュートリアルでは、アーキテクチャ内からデータ キャッシュをプログラムで操作する方法について説明します。

プログラミングに満足!

もっと読む

このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。

特別な感謝

このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリードレビュー担当者はテレサ・マーフィーでした。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 にmitchell@4GuysFromRolla.com行をドロップしてください。