使用 ObjectDataSource 快取暫存資料 (VB)

by Scott Mitchell

下載 PDF

快取可以決定 Web 應用程式是運行緩慢還是快速。 本教學是詳細介紹 ASP.NET 中的快取的四個教學中的第一個。 了解快取的關鍵概念以及如何透過 ObjectDataSource 控制項將快取套用到表示層。

簡介

在電腦科學中,快取是獲取獲取成本昂貴的資料或資訊並將其副本儲存在存取速度更快的位置的過程。 對於資料驅動的應用程序,大型且複雜的查詢通常會消耗應用程式的大部分執行時間。 因此,通常可以透過將昂貴的資料庫查詢結果儲存在應用程式的記憶體中來提高此類別應用程式的效能。

ASP.NET 2.0 提供了多種快取選項。 整個網頁或使用者控制項所呈現的標記碼可以透過輸出快取進行緩存。 ObjectDataSource 和SqlDataSource 控制項還提供快取功能,從而允許在控制項層級快取資料。 ASP.NET 的資料快取提供了豐富的快取 API,使頁面開發人員能夠以程式設計方式快取物件。 在本教學和接下來的三個教學中,我們將研究如何使用 ObjectDataSource 的快取功能以及資料快取。 我們還將探討如何在啟動時快取應用程式範圍的資料,以及如何透過使用 SQL 快取依賴項來保持快取資料最新。 這些教學課程不探討輸出快取。 有關輸出快取的詳細信息,請參閱 ASP.NET 2.0 中的輸出快取。

快取可以在架構的任何位置應用,從資料存取層到展示層。 在本教學中,我們將了解如何透過 ObjectDataSource 控制項將快取套用到表示層。 在下一個教學中,我們將研究業務邏輯層的快取資料。

關鍵快取概念

快取可以透過將生成成本高昂的資料保存為副本,並儲存在可以更有效存取的位置,來大幅提高應用程式的整體效能和擴充性。 由於快取僅保存實際基礎資料的副本,因此,如果基礎資料發生變更,它可能會變得過期或過時。 為了解決這個問題,頁面開發人員可以使用以下任一方法來指定從快取中逐出快取項目的標準:

  • 以時間導向的條件,可將項目新增至快取中,設定絕對時間或滑動時間。 例如,頁面開發人員可能會指定 60 秒的持續時間。 在絕對時間的設定下,快取項目在加入快取後 60 秒便會被移除,無論其存取頻率如何。 透過滑動到期時間,快取的項目將在上次造訪後 60 秒被逐出。
  • 基於依賴關係的準則,當新增到快取時,可以將依賴關係與項目關聯。 當項目的依賴關係發生變化時,它將從快取中移除。 依賴項可以是檔案、另一個快取項目或兩者的組合。 ASP.NET 2.0 還允許 SQL 快取依賴項,這使開發人員能夠將專案新增至快取中,並在底層資料庫資料變更時將其逐出。 我們將在接下來的使用 SQL 快取相依性教學中探討 SQL 快取相依性。

無論指定的逐出標準為何,都可以在滿足基於時間或基於依賴性的標準之前清除高速快取中的項目。 如果快取已達到其容量,則必須先刪除現有項目,然後才能新增項目。 因此,當以程式設計方式處理快取資料時,務必始終假設快取資料可能不存在,這一點非常重要。 在接下來的教學,在架構中快取資料,我們將了解以程式方式從程式庫存取資料時所使用的模式。

快取提供了一種經濟的方式來提高應用程式的效能。 正如 Steven Smith 在他的文章 ASP.NET Caching: Techniques and Best Practices中所闡述:

使用快取可以是一種方法,以不需花費大量時間和分析來達到足夠好的效能。 記憶體很便宜,因此如果您可以透過快取30 秒的輸出來獲得所需的效能,而不是花費一天或一周的時間來嘗試優化程式碼或資料庫,請執行快取解決方案 (假設30 秒的舊資料是可以的) 並繼續前進。 最終,糟糕的設計可能會困擾你,所以你當然應該嘗試正確設計你的應用程式。 但是,如果您今天只需要達到足夠好的效能,那麼快取可能是一個很好的方法,可以幫助您爭取時間,以便在日後有時間時重構您的應用程式。

雖然快取可以提供顯著的效能增強,但它並不適用於所有情況,例如使用即時、頻繁更新資料的應用程序,或即使是短暫的陳舊資料也是不可接受的。 但對於大多數應用程式來說,應該使用快取。 有關 ASP.NET 2.0 中快取的更多背景信息,請參閱 ASP.NET 2.0 QuickStart 教學課程的效能快取部分。

第 1 步:建立快取網頁

在開始探索 ObjectDataSource 的快取功能之前,我們先花點時間在我們的網站專案中建立 ASP.NET 頁面,本教學和接下來的三個教學將需要這些頁面。 首先新增一個名為 Caching 的新資料夾。 接下來,將以下 ASP.NET 頁面新增至該資料夾,確保將每個頁面與 Site.master 母版頁相關聯:

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

為快取相關教學新增 ASP.NET 頁面 為快取相關教學新增 ASP.NET 頁面

圖 1:為快取相關教學新增 ASP.NET 頁面

就像在其他資料夾一樣,Default.aspxCaching 資料夾中將列出其部分的教學課程。 請注意,SectionLevelTutorialListing.ascx 使用者控制元件提供了此功能。 因此,將此使用者控制項從解決方案資源管理器拖曳到頁面的設計檢視中的 Default.aspx 來新增。

圖 2:將 SectionLevelTutorialListing.ascx 使用者控制項加入 Default.aspx

圖 2:將使用者控制項新增到 (點擊查看完整尺寸圖片)

最後,將這些頁面作為條目新增至 Web.sitemap 文件。 具體來說,在處理二進位資料 之後,添加以下標記:

<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 後,稍微花點時間透過瀏覽器查看教學網站。 左側的選單現在包含快取教程的項目。

網站地圖現在包含「快取教學課程」的條目。

圖 3:網站地圖現在包含有關快取教程的條目

步驟 2:在網頁中顯示產品列表

本教學課程探討如何使用 ObjectDataSource 控制項的內建快取功能。 不過,在查看這些功能之前,我們首先需要一個可以使用的頁面。 讓我們建立一個網頁,該網頁使用 GridView 列出由 ObjectDataSource 從 ProductsBLL 類別中擷取到的產品資訊。

首先打開 ObjectDataSource.aspx 資料夾中的 Caching 頁面。 將 GridView 從工具箱拖曳到設計器上,將其 ID 屬性設為 Products,然後從其智慧標記中選擇將它綁定到名為 ProductsDataSource 的新 ObjectDataSource 控制項。 設定 ObjectDataSource 以與 ProductsBLL 類別一起使用。

設定 ObjectDataSource 以使用 ProductsBLL 類別

圖 4:設定 ObjectDataSource 以使用 ProductsBLL 類別 (按一下查看完整尺寸影像)

對於此頁面,讓我們建立一個可編輯的 GridView,以便我們可以檢查透過 GridView 的介面修改 ObjectDataSource 中快取的資料時會發生什麼。 請將 SELECT 標籤中的下拉菜單保留為預設選項 GetProducts(),但在 UPDATE 標籤中選擇接受 productNameunitPriceproductID 作為輸入參數的 UpdateProduct 重載方法。

將 UPDATE 標籤的下拉式清單設定為適當的 UpdateProduct 重載

圖 5:將 UPDATE 頁籤的下拉式清單設為適當的 重載 (按一下查看全尺寸影像)

最後,將「插入」和「刪除」標籤中的下拉清單設為 (無),然後按一下「完成」。 完成「設定資料來源」向導後,Visual Studio 將 ObjectDataSource 的 OldValuesParameterFormatString 屬性設為 original_{0}。 如同在《插入、更新和刪除資料概述》教學課程中所討論,由聲明性語法中移除此屬性或將其重設為預設值{0},是確保我們的更新工作流程無誤進行所必需的。

此外,精靈完成後,Visual Studio 會在 GridView 中為每個產品資料欄位新增一個欄位。 刪除除了 ProductNameCategoryNameUnitPrice BoundFields 之外的所有內容。 接下來,將每個 BoundField 的 HeaderText 屬性分別更新為 Product、Category 和 Price。 由於 ProductName 欄位是必需的,因此將 BoundField 轉換為 TemplateField,並向 EditItemTemplate 添加一個 RequiredFieldValidator。 同樣,將 UnitPrice BoundField 轉換為 TemplateField 並新增 CompareValidator 以確保使用者輸入的值是大於或等於零的有效貨幣值。 除了這些修改之外,您還可以隨意進行任何美觀的更改,例如將 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 中。

圖七:所有產品的名稱、類別和價格皆列於可排序、可分頁、可編輯的 GridView 中 (點擊以查看完整尺寸圖片)

步驟 3:檢查 ObjectDataSource 何時請求資料

GridView 透過呼叫 ObjectDataSource 的方法來擷取要顯示的資料。 此 ObjectDataSource 建立業務邏輯層的 ProductsBLL 類別的實例並呼叫其 GetProducts() 方法,該方法又呼叫資料存取層的 ProductsTableAdapterGetProducts() 方法。 DAL 方法連接到 Northwind 資料庫並執行已配置的SELECT查詢。 然後,該資料返回給 DAL,DAL 將其打包在 NorthwindDataTable。 DataTable 物件傳回 BLL,BLL 將其傳回 ObjectDataSource,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。

將標籤和按鈕新增到 GridView 的上方頁面中

圖 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 eventfired 。

在瀏覽器中造訪此頁面。 首次造訪該頁面時,會顯示「已觸發選擇事件」文字。 按一下「Postback」按鈕,注意文字會消失 (假設 GridView 的 EnableViewState 屬性設定為 True,預設為此值)。 這是因為,在回發時,GridView 是從其檢視狀態重建的,因此不會轉向 ObjectDataSource 取得其資料。 但是,對資料進行排序、分頁或編輯會導致 GridView 重新綁定到其資料來源,因此 Selecting 事件觸發的文字會重新出現。

每當 GridView 重新綁定到其資料來源時,就會觸發和顯示 Selecting 事件。

圖 9:每當 GridView 重新綁定到其資料來源時,顯示已觸發的選擇事件 (點擊查看完整尺寸圖片)

按下 "回發" 按鈕將會導致 "GridView" 從其 "視圖狀態" 重建

圖 10:點選回發按鈕會導致 GridView 從其檢視狀態重建 (點擊查看全尺寸影像)

每次對資料進行分頁或排序時擷取資料庫資料似乎很浪費。 畢竟,由於我們使用預設分頁,ObjectDataSource 在顯示第一頁時已擷取所有記錄。 即使 GridView 不提供排序和分頁支持,每次任何使用者首次造訪該頁面時 (如果停用檢視狀態,則在每次回發時) 都必須從資料庫擷取資料。 但如果 GridView 向所有使用者顯示相同的資料,這些額外的資料庫請求就是多餘的。 為什麼不快取從 GetProducts() 方法返回的結果,並將 GridView 綁定到快取的結果?

步驟 4:使用 ObjectDataSource 快取資料

透過簡單地設定一些屬性,ObjectDataSource 可以設定為自動將其擷取到的資料快取在 ASP.NET 資料快取中。 以下列表總結了 ObjectDataSource 的與快取相關的屬性:

  • 必須將 EnableCaching 設定為 True 以啟用快取。 預設值為 False
  • CacheDuration 是資料快取的時間(以秒為單位)。 預設值是 0。 ObjectDataSource 僅在 EnableCaching 設為 TrueCacheDuration 設定值大於零時,才會快取資料。
  • CacheExpirationPolicy 可以設定為AbsoluteSliding。 如果 Absolute,則 ObjectDataSource 將快取其擷取的資料 CacheDuration 秒;如果 Sliding,則資料僅在CacheDuration 秒內未被存取後才會過期。 預設值為 Absolute
  • CacheKeyDependency 使用這個屬性將 ObjectDataSource 的快取項目與現有的快取相依性關聯。 ObjectDataSource 的資料條目可以透過使其關聯的 CacheKeyDependency 過期而提前逐出快取。 此屬性最常用於將 SQL 快取相依性與 ObjectDataSource 的快取關聯起來,我們將在未來的 [使用 SQL 快取相依性] 教學中探討此主題。

讓我們將 ObjectDataSource 設定為以絕對時間快取其資料 30 秒。 將 ObjectDataSource 的 EnableCaching 屬性設為 True,並將其 CacheDuration 屬性設為 30。 請將 CacheExpirationPolicy 屬性保留為其預設值 Absolute

Configure the ObjectDataSource to Cache its Data for 30 Seconds設定 ObjectDataSource 將其資料快取 30 秒

圖 11:配置 ObjectDataSource 將其資料快取 30 秒 (按一下查看大圖)

儲存變更並在瀏覽器中重新造訪此頁面。 當您第一次訪問該頁面時,將顯示選擇事件觸發的文本,因為最初資料不在快取中。 但是,透過點擊「回發」按鈕、排序、分頁或點擊「編輯」或「取消」按鈕觸發的後續回發不會重新顯示「選擇」事件已觸發的文字。 這是因為 Selecting 事件僅在 ObjectDataSource 從其底層物件取得資料時觸發;如果從資料快取中提取資料,則不會觸發 Selecting 事件。

30 秒後,資料將從快取中清除。 如果呼叫 ObjectDataSource 的 InsertUpdateDelete 方法,資料也將從快取中移除。 因此,經過30秒或者點擊更新按鈕後,進行排序、分頁或點擊編輯或取消按鈕將會使 ObjectDataSource 從其基礎物件中獲取資料,並且當 Selecting 事件觸發時顯示「Selecting 事件已觸發」的訊息。 這些傳回的結果被放回資料快取中。

注意

如果您看到 Selecting 事件經常觸發文本,即使您希望 ObjectDataSource 使用快取資料,也可能是由於記憶體限制。 如果沒有足夠的可用記憶體,則由 ObjectDataSource 新增至快取的資料可能已清除。 如果 ObjectDataSource 似乎未正確快取資料或僅偶爾快取資料,請關閉一些應用程式以釋放記憶體,然後再試一次。

圖 12 說明了 ObjectDataSource 的快取工作流程。 當選擇事件觸發文字出現在螢幕上時,這是因為資料不在快取中,必須從底層物件中擷取。 然而,當此文字遺失時,這是因為資料可從快取中取得。 當資料從快取返回時,不會呼叫底層物件,因此不會執行資料庫查詢。

ObjectDataSource 從資料快取中儲存和擷取資料

圖 12:ObjectDataSource 在資料快取中儲存和擷取其資料

每個 ASP.NET 應用程式都有自己的資料快取實例,該實例在所有頁面和訪客之間共用。 這意味著 ObjectDataSource 儲存在資料快取中的資料同樣在存取該頁面的所有使用者之間共用。 若要驗證這一點,請在瀏覽器中開啟 ObjectDataSource.aspx 頁面。 首次造訪該頁面時,將出現 Selecting 事件觸發文字 (假設透過先前測試新增至快取的資料現在已被逐出)。 開啟第二個瀏覽器實例,然後將 URL 從第一個瀏覽器實例複製並貼上到第二個瀏覽器實例。 在第二個瀏覽器實例中,不會顯示選擇事件觸發的文本,因為它使用與第一個瀏覽器相同的快取資料。

將擷取到的資料插入快取時,ObjectDataSource 使用的快取鍵值包括:CacheDurationCacheExpirationPolicy 屬性值;ObjectDataSource 使用的基礎業務物件類型,透過 TypeName 屬性指定(在 ProductsBLL 的例子中);SelectMethod 屬性的值及SelectParameters 集合中參數的名稱和值;以及其 StartRowIndexMaximumRows 屬性的值,這些值在實作自訂分頁時使用。

將快取鍵值設計為這些屬性的組合可確保在這些值變更時獲得唯一的快取條目。 例如,在先前的教學課中,我們探討了使用 ProductsBLL 類別的 GetProductsByCategoryID(categoryID),此方法會傳回指定類別的所有產品。 一位使用者可能會造訪該頁面並查看飲料,而飲料的類別編號是1。 如果 ObjectDataSource 快取其結果而不考慮 SelectParameters 的值,那麼當另一位使用者來到頁面查看調味品時,而快取中有飲料產品,他們就會看到快取的飲料產品而不是調味品。 透過這些屬性(包括SelectParameters的值)來改變快取鍵,ObjectDataSource 為飲料和調味品維護一個單獨的快取條目。

陳舊資料問題

當呼叫其 Insert、Update 或 Delete 方法之一時,ObjectDataSource 會自動將其項目從快取中移除。 當透過頁面修改資料時,這有助於透過清除快取條目來防止資料過時。 但是,使用快取的 ObjectDataSource 仍可能顯示陳舊資料。 在最簡單的情況下,這可能是由於資料庫內的資料直接變更所致。 也許資料庫管理員只是執行了一個修改資料庫中某些記錄的指令碼。

這種情況也可能以更微妙的方式展開。 雖然 ObjectDataSource 在呼叫其一個資料修改方法時會從快取中逐出其項目,但被刪除的快取項目是針對 ObjectDataSource 的特定屬性值組合(CacheDurationTypeNameSelectMethod,等等)。 如果您有兩個使用不同的 SelectMethods 或 SelectParameters 的 ObjectDataSource,但仍然可以更新相同的資料,那麼一個 ObjectDataSource 可能會更新一行並使自己的快取條目失效,但第二個 ObjectDataSource 的相應行仍將從快取中提供。 我鼓勵您建立頁面來展示此功能。 建立一個頁面,顯示可編輯的 GridView。此 GridView 從使用快取的 ObjectDataSource 提取資料,並被配置為從 ProductsBLL 類別的 GetProducts() 方法取得資料。 將另一個可編輯的 GridView 和 ObjectDataSource 新增至此頁(或另一頁),但對於第二個 ObjectDataSource,請使用 GetProductsByCategoryID(categoryID) 方法。 由於兩個 ObjectDataSources SelectMethod 屬性不同,因此它們每個都有自己的快取值。 如果您在一個網格中編輯產品,下次將資料綁定回另一個網格時(透過分頁、排序等方式),它仍然會提供舊的快取資料,並且不會反映從另一個網格進行的更改。

簡而言之,只有在您願意接受過時資料的情況下才使用基於時間的過期時間,而對於資料新鮮度很重要的情況則使用較短的過期時間。 如果過時的資料不可接受,請放棄快取或使用 SQL 快取依賴項 (假設您正在快取的是資料庫資料)。 我們將在以後的教學課程中探討 SQL 快取依賴關係。

摘要

在本教學課程中,我們研究了 ObjectDataSource 的內建快取功能。 透過簡單地設定一些屬性,我們可以指示 ObjectDataSource 將從指定的SelectMethod 傳回的結果快取到 ASP.NET 資料快取中。 CacheDurationCacheExpirationPolicy 屬性指示快取項目的持續時間,以及這些屬性是絕對過期還是滑動過期。 CacheKeyDependency 屬性將所有 ObjectDataSource 的快取條目與現有的快取相依性關聯。 這可用於在達到基於時間的到期之前從快取中逐出 ObjectDataSource 條目,並且通常與 SQL 快取依賴項一起使用。

由於 ObjectDataSource 只是將其值快取到資料快取中,因此我們可以透過程式設計方式複製 ObjectDataSource 的內建功能。 在展示層執行此操作沒有意義,因為 ObjectDataSource 已經內建了這項功能,但我們可以在架構中單獨的層中實現快取功能。 為此,我們需要重複 ObjectDataSource 使用的相同邏輯。 在下一個教學中,我們將探討如何在架構內以程式設計方式使用資料快取。

快樂程式!

深入閱讀

有關本教學課程中討論的主題的更多信息,請參閱以下資源:

關於作者

斯科特·米切爾,七本 ASP/ASP.NET 書籍和 4GuysFromRolla.com 創始人的作者,自1998年以來一直與Microsoft Web 技術合作。 史考特是一名獨立顧問、培訓師和作家。 他的最新著作是Sams Teach Yourself ASP.NET 2.0 in 24 Hours。 可以透過 mitchell@4GuysFromRolla.com 聯絡他。

特別感謝

本教學系列得到了許多有用的審閱者的審閱。 本教學的首席審閱者是 Teresa Murphy。 有興趣查看我即將發表的 MSDN 文章嗎? 如果是,請在 mitchell@4GuysFromRolla.com給我留言。

上一個下一個