ObjectDataSource でデータをキャッシュする (VB)
キャッシュは、低速 Web アプリケーションと高速 Web アプリケーションの違いを意味する可能性があります。 このチュートリアルは、ASP.NET でのキャッシュの詳細を確認する 4 つの最初のチュートリアルです。 キャッシュの主な概念と、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
図 1: Caching-Related チュートリアルの ASP.NET ページを追加する
他のフォルダーと同様に、 Default.aspx
フォルダーの Caching
セクションにチュートリアルが一覧表示されます。 ユーザー コントロールには 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にドラッグし、そのプロパティを ID
にProducts
設定し、スマート タグから という名前ProductsDataSource
の新しい ObjectDataSource コントロールにバインドすることを選択します。 クラスを操作するように ObjectDataSource を ProductsBLL
構成します。
図 4: クラスを使用するように ObjectDataSource を構成する ProductsBLL
(フルサイズの画像を表示するにはクリックします)
このページでは、編集可能な GridView を作成して、ObjectDataSource にキャッシュされたデータが GridView インターフェイスを介して変更された場合の動作を確認できるようにします。 [選択] タブのドロップダウン リストは既定の に設定したままにしますが、[更新] タブで選択した項目を、GetProducts()
入力パラメーターとして 、unitPrice
、 productID
を受け入れるproductName
オーバーロードにUpdateProduct
変更します。
図 5: UPDATE タブの Drop-Down リストを適切な UpdateProduct
オーバーロードに設定します (フルサイズの画像を表示するにはクリックします)
最後に、[挿入] タブと [削除] タブのドロップダウン リストを [(なし)] に設定し、[完了] をクリックします。 データ ソースの構成ウィザードが完了すると、Visual Studio によって ObjectDataSource の プロパティが OldValuesParameterFormatString
に original_{0}
設定されます。 「 データの挿入、更新、および削除の概要 」チュートリアルで説明したように、更新ワークフローをエラーなく続行するには、このプロパティを宣言構文から削除するか、 {0}
既定値に戻す必要があります。
さらに、ウィザードの完了時に、Visual Studio は各製品データ フィールドのフィールドを GridView に追加します。 、CategoryName
、ProductName
および UnitPrice
BoundFields 以外のすべてを削除します。 次に HeaderText
、これらの BoundFields の各プロパティをそれぞれ Product、Category、Price に更新します。 フィールドは ProductName
必須であるため、BoundField を TemplateField に変換し、RequiredFieldValidator を に追加します EditItemTemplate
。 同様に、BoundField を UnitPrice
TemplateField に変換し、CompareValidator を追加して、ユーザーが入力した値が 0 以上の有効な通貨値であることを確認します。 これらの変更に加えて、値の右揃え UnitPrice
や、読み取り専用インターフェイスと編集インターフェイスでのテキストの書式設定 UnitPrice
の指定など、美的な変更を自由に実行できます。
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 には、データベース内の各製品の名前、カテゴリ、価格が一覧表示されます。 少し時間を取って、ページの機能をテストして結果を並べ替え、ページを並べ替え、レコードを編集します。
図 7: 各製品の名前、カテゴリ、および価格が並べ替え可能、ページング可能、編集可能な GridView に一覧表示されている (フルサイズの画像を表示する をクリックします)
手順 3: ObjectDataSource がデータを要求しているタイミングを調べる
GridView は Products
、ObjectDataSource の メソッドを Select
呼び出して、表示するデータを ProductsDataSource
取得します。 この ObjectDataSource は、ビジネス ロジック レイヤーの ProductsBLL
クラスのインスタンスを作成し、そのメソッドをGetProducts()
呼び出します。これにより、データ アクセス層の メソッドがProductsTableAdapter
GetProducts()
呼び出されます。 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
クリアし、そのプロパティを EnableViewState
に False
設定します。 Label の下に Button Web コントロールを追加し、そのプロパティを Text
Postback に設定します。
図 8: GridView の上のページにラベルとボタンを追加する (フルサイズの画像を表示する をクリックします)
データ アクセス ワークフロー中、ObjectDataSource イベント Selecting
は、基になるオブジェクトが作成され、構成されたメソッドが呼び出される前に発生します。 このイベントのイベント ハンドラーを作成し、次のコードを追加します。
Protected Sub ProductsDataSource_Selecting(sender As Object, _
e As ObjectDataSourceSelectingEventArgs) _
Handles ProductsDataSource.Selecting
ODSEvents.Text = "-- Selecting event fired"
End Sub
ObjectDataSource がデータのアーキテクチャに対して要求を行うたびに、Label に Selecting イベントが発生したというテキストが表示されます。
ブラウザーでこのページにアクセスします。 ページが最初にアクセスされると、Selecting イベントが発生したというテキストが表示されます。 [ポストバック] ボタンをクリックし、テキストが表示されなくなることに注意してください (GridView の EnableViewState
プロパティが既定値の に True
設定されている場合)。 これは、ポストバック時に GridView がそのビュー ステートから再構築されるため、データの ObjectDataSource に変換されないためです。 ただし、データの並べ替え、ページング、または編集を行うと、GridView がデータ ソースに再バインドされるため、Selecting イベントが発生したテキストが再び表示されます。
図 9: GridView がデータ ソースに再バインドされるたびに、発生したイベントの選択が表示されます (フルサイズの画像を表示する をクリックします)。
図 10: ポストバック ボタンをクリックすると、GridView がビューステートから再構築されます (フルサイズの画像を表示する場合はクリックします)
データがページングまたは並べ替えられるたびにデータベース データを取得するのは無駄に思える場合があります。 結局のところ、既定のページングを使用しているため、ObjectDataSource は最初のページを表示するときにすべてのレコードを取得しました。 GridView で並べ替えとページングのサポートが提供されない場合でも、ページが最初にユーザーによってアクセスされるたびに (ビュー ステートが無効になっている場合は、すべてのポストバックで) データをデータベースから取得する必要があります。 ただし、GridView がすべてのユーザーに同じデータを表示している場合、これらの追加のデータベース要求は余分です。 メソッドから返された結果をキャッシュし GetProducts()
、GridView をキャッシュされた結果にバインドしてみませんか?
手順 4: ObjectDataSource を使用してデータをキャッシュする
いくつかのプロパティを設定するだけで、取得したデータを ASP.NET データ キャッシュに自動的にキャッシュするように ObjectDataSource を構成できます。 次の一覧は、ObjectDataSource のキャッシュ関連のプロパティをまとめたものです。
- キャッシュを有効にするには、EnableCaching を に
True
設定する必要があります。 既定値は、False
です。 - CacheDuration データがキャッシュされる時間 (秒単位)。 既定値は 0 です。 ObjectDataSource は、 が で
True
CacheDuration
、0 より大きい値に設定されている場合EnableCaching
にのみデータをキャッシュします。 - CacheExpirationPolicy は または
Sliding
にAbsolute
設定できます。 の場合Absolute
、ObjectDataSource は、取得したデータを秒単位でCacheDuration
キャッシュします。の場合Sliding
、データの有効期限は、秒のアクセスCacheDuration
が行われなかった後に限られます。 既定では、Absolute
です。 - CacheKeyDependency では、このプロパティを使用して、ObjectDataSource のキャッシュ エントリを既存のキャッシュ依存関係に関連付けます。 ObjectDataSource のデータ エントリは、関連付けられている
CacheKeyDependency
の有効期限が切れてキャッシュから途中で削除される可能性があります。 このプロパティは、SQL キャッシュの依存関係を ObjectDataSource のキャッシュに関連付けるために最も一般的に使用されます。これについては、SQL キャッシュ依存関係の使用 に関するチュートリアルで今後説明するトピックです。
ObjectDataSource を ProductsDataSource
構成して、データを絶対スケールで 30 秒間キャッシュします。 ObjectDataSource の EnableCaching
プロパティを に True
設定し、その CacheDuration
プロパティを 30 に設定します。 プロパティは既定Absolute
の CacheExpirationPolicy
に設定したままにします。
図 11: 30 秒間データをキャッシュするように ObjectDataSource を構成する (フルサイズの画像を表示する をクリックします)
変更内容を保存し、ブラウザーでこのページを再表示します。 Selecting イベントが発生したテキストは、最初にデータがキャッシュに入っていないので、ページに初めてアクセスしたときに表示されます。 ただし、[ポストバック] ボタンのクリック、並べ替え、ページング、または [編集] ボタンまたは [キャンセル] ボタンのクリックによってトリガーされる後続のポストバックでは、Selecting イベントが発生したテキストは再表示 されません 。 これは、 Selecting
ObjectDataSource が基になるオブジェクトからデータを取得した場合にのみイベントが発生するためです。データが Selecting
データ キャッシュからプルされた場合、イベントは発生しません。
30 秒後、データはキャッシュから削除されます。 ObjectDataSource の Insert
、 Update
、または Delete
メソッドが呼び出されると、データもキャッシュから削除されます。 したがって、30 秒が経過するか、[更新] ボタンがクリック、並べ替え、ページング、または [編集] ボタンまたは [キャンセル] ボタンをクリックすると、ObjectDataSource は基になるオブジェクトからデータを取得し、イベントが発生したときに Selecting
Selecting イベントが発生したテキストを表示します。 これらの返された結果は、データ キャッシュに戻されます。
注意
Selecting イベントが発生したテキストが頻繁に表示される場合は、ObjectDataSource がキャッシュされたデータを操作することが予想される場合でも、メモリの制約が原因である可能性があります。 空きメモリが不足している場合は、ObjectDataSource によってキャッシュに追加されたデータが消去されている可能性があります。 ObjectDataSource がデータを正しくキャッシュしているように見えない場合、またはデータを散発的にキャッシュするだけの場合は、一部のアプリケーションを閉じてメモリを解放してからやり直してください。
図 12 は、ObjectDataSource のキャッシュ ワークフローを示しています。 Selecting イベントが発生したテキストが画面に表示されるのは、データがキャッシュに存在せず、基になるオブジェクトから取得する必要があったためです。 ただし、このテキストが見つからない場合は、データがキャッシュから使用できたためです。 キャッシュからデータが返されると、基になるオブジェクトの呼び出しがないため、データベース クエリは実行されません。
図 12: ObjectDataSource は、データ キャッシュからデータを格納および取得します
各 ASP.NET アプリケーションには、すべてのページと閲覧者で共有される独自のデータ キャッシュ インスタンスがあります。 つまり、ObjectDataSource によってデータ キャッシュに格納されているデータも、ページにアクセスするすべてのユーザー間で共有されます。 これを確認するには、ブラウザーでページを ObjectDataSource.aspx
開きます。 ページに初めてアクセスすると、Selecting イベントが発生したテキストが表示されます (以前のテストによってキャッシュに追加されたデータが削除されたと仮定します)。 2 番目のブラウザー インスタンスを開き、最初のブラウザー インスタンスから 2 番目のブラウザー インスタンスに URL をコピーして貼り付けます。 2 番目のブラウザー インスタンスでは、Selecting イベントが発生したテキストは、最初のと同じキャッシュされたデータを使用しているため、表示されません。
取得したデータをキャッシュに挿入する場合、ObjectDataSource は、プロパティ値と CacheExpirationPolicy
プロパティ値、ObjectDataSource によって使用される基になるビジネス オブジェクトの型 (ProductsBLL
この例では) 、プロパティの値、TypeName
コレクション内SelectParameters
のパラメーターのSelectMethod
名前と値、および プロパティStartRowIndex
MaximumRows
の値を含むCacheDuration
キャッシュ キー値を使用します。 カスタム ページングを実装するときに使用されます。
これらのプロパティの組み合わせとしてキャッシュ キー値を作成すると、これらの値が変更されるにつれて一意のキャッシュ エントリが保証されます。 たとえば、過去のチュートリアルでは、 クラス s GetProductsByCategoryID(categoryID)
を使用してProductsBLL
、指定したカテゴリのすべての製品を返します。 1 人のユーザーがページに来て、1 の飲み物を CategoryID
表示する場合があります。 ObjectDataSource が値に関係 SelectParameters
なく結果をキャッシュした場合、別のユーザーがページに来て、飲料製品がキャッシュに入っている間に、その飲み物の製品が表示されるのではなく、キャッシュされた飲料製品が表示されます。 の値 SelectParameters
を含むこれらのプロパティによってキャッシュ キーを変更することで、ObjectDataSource は飲料とコンディメント用の個別のキャッシュ エントリを保持します。
古いデータに関する懸念事項
ObjectDataSource は、または Delete
のいずれかのメソッドが呼び出されるとInsert
Update
、その項目をキャッシュから自動的に削除します。 これにより、ページを介してデータが変更されたときにキャッシュ エントリをクリアすることで、古いデータから保護できます。 ただし、キャッシュを使用している ObjectDataSource で古いデータを表示することはできます。 最も単純なケースでは、データベース内でデータが直接変更される可能性があります。 データベース管理者が、データベース内のレコードの一部を変更するスクリプトを実行しただけかもしれません。
このシナリオは、より微妙な方法で展開することもできます。 ObjectDataSource は、データ変更メソッドの 1 つが呼び出されたときにキャッシュから項目を削除しますが、削除されるキャッシュされた項目は、ObjectDataSource のプロパティ値の特定の組み合わせ (CacheDuration
、、TypeName
SelectMethod
、など) に対して行われます。 異なる 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行をドロップしてください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示