Ukládání dat do mezipaměti ovládacím prvkem ObjectDataSource (C#)
Ukládání do mezipaměti může znamenat rozdíl mezi pomalou a rychlou webovou aplikací. Tento kurz je prvním ze čtyř, který se podrobně podívá na ukládání do mezipaměti v ASP.NET. Seznamte se s klíčovými koncepty ukládání do mezipaměti a jak použít ukládání do mezipaměti na prezentační vrstvu prostřednictvím ovládacího prvku ObjectDataSource.
Úvod
V počítačových vědách je ukládání do mezipaměti proces získávání dat nebo informací, které je nákladné získat, a uložení jejich kopie do umístění, ke kterému je rychlejší přístup. U aplikací řízených daty velké a složité dotazy obvykle spotřebovávají většinu času provádění aplikace. Takový výkon aplikace je pak často možné zvýšit uložením výsledků náročných databázových dotazů do paměti aplikace.
ASP.NET 2.0 nabízí celou řadu možností ukládání do mezipaměti. Celá webová stránka nebo vykreslené značky uživatelského ovládacího prvku je možné ukládat do mezipaměti prostřednictvím ukládání výstupu do mezipaměti. Ovládací prvky ObjectDataSource a SqlDataSource poskytují také možnosti ukládání do mezipaměti, což umožňuje ukládání dat do mezipaměti na úrovni ovládacího prvku. Mezipaměť dat ASP.NET poskytuje bohaté rozhraní API pro ukládání do mezipaměti, které vývojářům stránek umožňuje programově ukládat objekty do mezipaměti. V tomto kurzu a dalších třech se podíváme na použití funkcí ukládání do mezipaměti ObjectDataSource a také mezipaměti dat. Podíváme se také na to, jak při spuštění ukládat data pro celou aplikaci do mezipaměti a jak udržovat data uložená v mezipaměti v aktuálnost pomocí závislostí mezipaměti SQL. Tyto kurzy neprobádají ukládání výstupu do mezipaměti. Podrobný přehled o ukládání výstupu do mezipaměti najdete v tématu Ukládání výstupu do mezipaměti v ASP.NET 2.0.
Ukládání do mezipaměti je možné použít na libovolném místě v architektuře, od vrstvy přístupu k datům až po prezentační vrstvu. V tomto kurzu se podíváme na použití ukládání do mezipaměti na prezentační vrstvu prostřednictvím ovládacího prvku ObjectDataSource. V dalším kurzu prozkoumáme ukládání dat do mezipaměti ve vrstvě obchodní logiky.
Koncepty ukládání klíčů do mezipaměti
Ukládání do mezipaměti může výrazně zlepšit celkový výkon a škálovatelnost aplikace tím, že vezme data, která jsou nákladná na generování, a uloží jejich kopii do umístění, ke kterému se dá přistupovat efektivněji. Vzhledem k tomu, že mezipaměť obsahuje jenom kopii skutečných podkladových dat, může být zastaralá nebo zastaralá, pokud se podkladová data změní. Vývojář stránky může určit kritéria, podle kterých se položka mezipaměti z mezipaměti vyřadí , a to pomocí těchto možností:
- Kritéria založená na čase : Položka může být přidána do mezipaměti po dobu absolutní nebo posuvné doby trvání. Vývojář stránky může například označit dobu trvání řekněme 60 sekund. S absolutní dobou trvání se položka v mezipaměti vyřadí 60 sekund po přidání do mezipaměti bez ohledu na to, jak často se k ní přistupovalo. Při posuvné délce se položka uložená v mezipaměti vyřadí 60 sekund po posledním přístupu.
- Kritéria založená na závislostech : Závislost může být při přidání do mezipaměti přidružena k položce. Když se závislost položky změní, vyřadí se z mezipaměti. Závislostí může být soubor, jiná položka mezipaměti nebo jejich kombinace. ASP.NET 2.0 také umožňuje závislosti mezipaměti SQL, které vývojářům umožňují přidat položku do mezipaměti a nechat ji vyřadit při změně podkladových dat databáze. Závislosti mezipaměti SQL prozkoumáme v nadcházejícím kurzu Používání závislostí mezipaměti SQL .
Bez ohledu na zadaná kritéria vyřazení může být položka v mezipaměti uklízena před splněním kritérií založených na čase nebo závislostech. Pokud mezipaměť dosáhla své kapacity, je nutné před přidáváním nových položek odebrat existující položky. V důsledku toho je při programové práci s daty v mezipaměti důležité, abyste vždy předpokládali, že data uložená v mezipaměti nemusí existovat. V dalším kurzu Ukládání dat do mezipaměti v architektuře se podíváme na vzor, který se má použít při programovém přístupu k datům z mezipaměti.
Ukládání do mezipaměti poskytuje ekonomický způsob, jak z aplikace získat vyšší výkon. Jak popisuje Steven Smith ve svém článku ASP.NET ukládání do mezipaměti: Techniky a osvědčené postupy:
Ukládání do mezipaměti může být dobrým způsobem, jak dosáhnout dostatečného výkonu, aniž byste museli vyžadovat spoustu času a analýzy. Paměť je levná, takže pokud můžete dosáhnout požadovaného výkonu ukládáním výstupu do mezipaměti po dobu 30 sekund místo toho, abyste strávili den nebo týden optimalizací kódu nebo databáze, udělejte řešení ukládání do mezipaměti (za předpokladu, že 30sekundová stará data jsou v pořádku) a přejděte dál. Nakonec vás pravděpodobně dožene špatný návrh, takže byste se samozřejmě měli pokusit navrhnout aplikace správně. Pokud ale dnes potřebujete dosáhnout dostatečného výkonu, může být ukládání do mezipaměti vynikajícím [přístupem] a získat čas na refaktoring aplikace později, až budete mít čas na to.
Ukládání do mezipaměti sice může přinést výrazné vylepšení výkonu, ale není použitelné ve všech situacích, například v aplikacích, které používají data v reálném čase a často se aktualizují nebo kde jsou i krátkodobě zastaralá data nepřijatelná. U většiny aplikací by se ale mělo používat ukládání do mezipaměti. Další informace o ukládání do mezipaměti v ASP.NET 2.0 najdete v části Ukládání do mezipaměti pro výkonv úvodních kurzech ASP.NET 2.0.
Krok 1: Vytvoření ukládání webových stránek do mezipaměti
Než začneme zkoumat funkce ukládání do mezipaměti ObjectDataSource, udělejme si nejdřív chvilku a vytvořte ASP.NET stránky v našem webovém projektu, které budeme potřebovat pro tento kurz a další tři. Začněte přidáním nové složky s názvem Caching
. Dále do této složky přidejte následující ASP.NET stránky a nezapomeňte přidružit každou stránku ke Site.master
stránce předlohy:
Default.aspx
ObjectDataSource.aspx
FromTheArchitecture.aspx
AtApplicationStartup.aspx
SqlCacheDependencies.aspx
Obrázek 1: Přidání stránek ASP.NET pro kurzy Caching-Related
Stejně jako v ostatních složkách Default.aspx
bude ve Caching
složce seznam kurzů ve své části. Vzpomeňte si SectionLevelTutorialListing.ascx
, že tuto funkci poskytuje uživatelský ovládací prvek. Proto přidejte tento uživatelský ovládací prvek do Default.aspx
tak, že ho přetáhnete z Průzkumník řešení do zobrazení Návrh stránky.
Obrázek 2: Obrázek 2: Přidání SectionLevelTutorialListing.ascx
uživatelského ovládacího prvku do Default.aspx
(kliknutím zobrazíte obrázek v plné velikosti)
Nakonec přidejte tyto stránky jako položky do Web.sitemap
souboru. Konkrétně přidejte následující kód za Práci s binárními daty <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>
Po aktualizaci Web.sitemap
si chvíli prohlédněte web kurzů v prohlížeči. Nabídka na levé straně teď obsahuje položky pro kurzy ukládání do mezipaměti.
Obrázek 3: Mapa webu teď obsahuje položky pro kurzy ukládání do mezipaměti
Krok 2: Zobrazení seznamu produktů na webové stránce
Tento kurz zkoumá, jak používat integrované funkce ukládání do mezipaměti ovládacích prvků ObjectDataSource. Než se ale na tyto funkce podíváme, potřebujeme nejprve stránku, ze které se dá pracovat. Umožňuje vytvořit webovou stránku, která používá GridView k výpisu informací o produktu načtených ObjectDataSource z ProductsBLL
třídy.
Začněte otevřením ObjectDataSource.aspx
stránky ve Caching
složce. Přetáhněte objekt GridView z panelu nástrojů do Designer, nastavte jeho ID
vlastnost na Products
a z jeho inteligentní značky zvolte vytvořit vazbu k novému ovládacímu prvku ObjectDataSource s názvem ProductsDataSource
. Nakonfigurujte ObjectDataSource pro práci s ProductsBLL
třídou.
Obrázek 4: Konfigurace objektu ObjectDataSource pro použití ProductsBLL
třídy (kliknutím zobrazíte obrázek v plné velikosti)
Pro tuto stránku vytvoříme upravitelný objekt GridView, abychom mohli prozkoumat, co se stane při úpravě dat uložených v mezipaměti ObjectDataSource prostřednictvím rozhraní GridView s. Ponechte rozevírací seznam na kartě SELECT nastavený na výchozí hodnotu , GetProducts()
ale změňte vybranou položku na kartě UPDATE na UpdateProduct
přetížení, které přijímá productName
, unitPrice
a productID
jako vstupní parametry.
Obrázek 5: Nastavení seznamu Drop-Down karet UPDATE na odpovídající UpdateProduct
přetížení (kliknutím zobrazíte obrázek v plné velikosti)
Nakonec nastavte rozevírací seznamy na kartách INSERT a DELETE na (Žádný) a klikněte na Dokončit. Po dokončení průvodce konfigurací zdroje dat sada Visual Studio nastaví vlastnost ObjectDataSource na OldValuesParameterFormatString
original_{0}
. Jak je popsáno v kurzu Přehled vložení, aktualizace a odstranění dat , musí být tato vlastnost odebrána z deklarativní syntaxe nebo nastavena zpět na výchozí hodnotu , {0}
aby pracovní postup aktualizace mohl pokračovat bez chyby.
Po dokončení průvodce navíc Visual Studio přidá pole do GridView pro každé z datových polí produktu. Odeberte všechna ProductName
pole kromě , CategoryName
a UnitPrice
BoundFields. Dále aktualizujte HeaderText
vlastnosti každého z těchto polí BoundFields na Product (Produkt), Category (Kategorie) a Price (Cena). Vzhledem k tomu, že ProductName
pole je povinné, převeďte BoundField na TemplateField a přidejte RequiredFieldValidator do EditItemTemplate
. Podobně převeďte BoundField na UnitPrice
TemplateField a přidejte CompareValidator, aby se zajistilo, že hodnota zadaná uživatelem je platná hodnota měny, která je větší než nebo rovna nule. Kromě těchto úprav můžete provádět jakékoli estetické změny, jako je zarovnání hodnoty doprava UnitPrice
nebo určení formátování textu v jeho rozhraních jen pro UnitPrice
čtení a úpravy.
Upravte objekt GridView zaškrtnutím políčka Povolit úpravy v inteligentní značce GridView s. Zaškrtněte také políčka Povolit stránkování a Povolit řazení.
Poznámka
Potřebujete si projít, jak přizpůsobit rozhraní pro úpravy GridView? Pokud ano, projděte si kurz Přizpůsobení rozhraní pro úpravu dat .
Obrázek 6: Povolení podpory GridView pro úpravy, řazení a stránkování (kliknutím zobrazíte obrázek v plné velikosti)
Po provedení těchto úprav objektu GridView by deklarativní značky GridView a ObjectDataSource měly vypadat přibližně takto:
<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>
Jak ukazuje obrázek 7, upravitelné zobrazení GridView uvádí název, kategorii a cenu jednotlivých produktů v databázi. Chvíli si otestujte funkčnost stránky a seřaďte výsledky, projděte si je a upravte záznam.
Obrázek 7: Název, kategorie a cena každého produktu je uveden v seřaditelném, stránkovatelném a upravitelném gridview (kliknutím zobrazíte obrázek v plné velikosti)
Krok 3: Zkoumání, kdy ObjectDataSource požaduje data
GridView Products
načte svá data k zobrazení vyvoláním Select
metody ProductsDataSource
ObjectDataSource. Tento ObjectDataSource vytvoří instanci třídy Business Logic Layer s ProductsBLL
a volá její GetProducts()
metodu, která zase volá metodu Data Access Layer s ProductsTableAdapter
GetProducts()
. Metoda DAL se připojí k databázi Northwind a vydá nakonfigurovaný SELECT
dotaz. Tato data se pak vrátí do souboru DAL, který je zabalí do NorthwindDataTable
souboru . Objekt DataTable je vrácen do BLL, který ho vrátí do ObjectDataSource, který ho vrátí do GridView. Objekt GridView pak vytvoří GridViewRow
objekt pro každou DataRow
z nich v DataTable a každý GridViewRow
se nakonec vykreslí do HTML, který se vrátí klientovi a zobrazí se v prohlížeči návštěvníka.
K této posloupnosti událostí dochází pokaždé, když GridView potřebuje vytvořit vazbu k podkladovým datům. K tomu dochází při první návštěvě stránky, při přesunu z jedné stránky dat na jinou, při řazení objektu GridView nebo při úpravě dat GridView s prostřednictvím předdefinovaných rozhraní pro úpravy nebo odstraňování. Pokud je stav zobrazení GridView zakázán, gridView bude doskok také na každém postbacku. GridView může být také explicitně odskok na svá data voláním jeho DataBind()
metody.
Abychom plně ocenili frekvenci načítání dat z databáze, nechte si zobrazit zprávu s informací, kdy se data znovu načítají. Přidejte ovládací prvek Label Web nad GridView s názvem ODSEvents
. Vymažte jeho Text
vlastnost a nastavte její EnableViewState
vlastnost na false
. Pod popisek přidejte webový ovládací prvek Button a nastavte jeho Text
vlastnost na Postback .
Obrázek 8: Přidání popisku a tlačítka na stránku nad gridview (kliknutím zobrazíte obrázek v plné velikosti)
Během pracovního postupu přístupu k datům se událost ObjectDataSource aktivuje Selecting
před vytvořením základního objektu a vyvolání jeho nakonfigurované metody. Vytvořte obslužnou rutinu události pro tuto událost a přidejte následující kód:
protected void ProductsDataSource_Selecting(object sender,
ObjectDataSourceSelectingEventArgs e)
{
ODSEvents.Text = "-- Selecting event fired";
}
Pokaždé, když ObjectDataSource odešle požadavek na architekturu na data, popisek zobrazí text Selecting event aktivd .
Navštivte tuto stránku v prohlížeči. Při první návštěvě stránky se zobrazí text Výběr aktivované události. Klikněte na tlačítko Postback a všimněte si, že text zmizí (za předpokladu, že vlastnost GridView s EnableViewState
je nastavená na true
výchozí hodnotu). Důvodem je to, že při zpětném vrácení objektu GridView je rekonstruován ze stavu zobrazení, a proto se pro svá data nepřepne na ObjectDataSource. Řazení, stránkování nebo úpravy dat však způsobí, že Objekt GridView se znovu připojí ke zdroji dat, a proto se znovu objeví text aktivovaný v události Selecting.
Obrázek 9: Pokaždé, když gridview znovu odskočí do zdroje dat, zobrazí se aktivovaná událost výběru (kliknutím zobrazíte obrázek v plné velikosti).
Obrázek 10: Kliknutí na tlačítko Postback způsobí, že objekt GridView bude rekonstruován ze stavu zobrazení (kliknutím zobrazíte obrázek v plné velikosti)
Může se zdát zbytečné načítat data databáze pokaždé, když jsou data stránkována nebo seřazena. Protože používáme výchozí stránkování, ObjectDataSource při zobrazení první stránky načetl všechny záznamy. I když GridView neposkytuje podporu řazení a stránkování, musí být data načtena z databáze při každé první návštěvě stránky libovolným uživatelem (a při každém zpětném odeslání, pokud je stav zobrazení zakázán). Pokud ale GridView zobrazuje všem uživatelům stejná data, jsou tyto žádosti o databázi nadbytečné. Proč neukázat výsledky vrácené z metody do GetProducts()
mezipaměti a svázat GridView s těmito výsledky v mezipaměti?
Krok 4: Ukládání dat do mezipaměti pomocí objektu ObjectDataSource
Jednoduchým nastavením několika vlastností lze objekt ObjectDataSource nakonfigurovat tak, aby automaticky ukládal načtená data do mezipaměti ASP.NET. Následující seznam shrnuje vlastnosti objektu ObjectDataSource související s mezipamětí:
- Povolení ukládání do mezipaměti musí být nastaveno na
true
hodnotu EnableCaching. Výchozí formát jefalse
. - CacheDuration doba v sekundách, po kterou se data ukládají do mezipaměti. Výchozí hodnota je 0. ObjectDataSource bude ukládat data do mezipaměti pouze v případě
EnableCaching
, že jetrue
aCacheDuration
je nastavena na hodnotu větší než nula. - CacheExpirationPolicy lze nastavit na
Absolute
neboSliding
. PokudAbsolute
objekt ObjectDataSource uloží načtená data do mezipaměti po dobuCacheDuration
několika sekund; pokudSliding
, platnost dat vyprší až poté, co se k datům po dobuCacheDuration
několika sekund nepřistupuje. Výchozí formát jeAbsolute
. - CacheKeyDependency pomocí této vlastnosti přidružte položky mezipaměti ObjectDataSource s existující závislostí mezipaměti. Položky dat ObjectDataSource s lze předčasně vyřadit z mezipaměti vypršením jeho přidružené
CacheKeyDependency
. Tato vlastnost se nejčastěji používá k přidružení závislosti mezipaměti SQL k mezipaměti ObjectDataSource s, což je téma, které prozkoumáme v budoucnu v kurzu Používání závislostí mezipaměti SQL .
Pojďme nakonfigurovat ProductsDataSource
ObjectDataSource tak, aby jeho data v absolutním měřítku po dobu 30 sekund uklaťovala. Vlastnost ObjectDataSource s EnableCaching
nastavte na true
a její CacheDuration
vlastnost na 30. CacheExpirationPolicy
Vlastnost ponechte nastavenou na výchozí hodnotu Absolute
.
Obrázek 11: Konfigurace objektu ObjectDataSource pro ukládání dat do mezipaměti po dobu 30 sekund (kliknutím zobrazíte obrázek v plné velikosti)
Uložte změny a znovu přejděte na tuto stránku v prohlížeči. Při první návštěvě stránky se zobrazí text s aktivovaným výběrem události, protože data nejsou v mezipaměti. Při následném zpětném odeslání aktivovaném kliknutím na tlačítko Zpět, řazením, stránkováním nebo kliknutím na tlačítka Upravit nebo Zrušit se znovu nezobrazí text aktivovaný událostí Výběr. Důvodem je to, že Selecting
událost se aktivuje pouze tehdy, když ObjectDataSource získá data ze svého základního objektu Selecting
; událost se neaktivuje, pokud jsou data načítaná z mezipaměti dat.
Po 30 sekundách se data z mezipaměti vyřadí. Data budou také vyřazena z mezipaměti, pokud jsou vyvolány metody ObjectDataSource s Insert
, Update
nebo Delete
. V důsledku toho po uplynutí 30 sekund nebo kliknutí na tlačítko Aktualizovat, řazení, stránkování nebo kliknutí na tlačítka Upravit nebo Zrušit způsobí, že ObjectDataSource získá data ze svého základního objektu. Při spuštění události se zobrazí text Selecting
Selecting event aktivovaný. Tyto vrácené výsledky se umístí zpět do mezipaměti dat.
Poznámka
Pokud se při výběru události často aktivuje text, i když očekáváte, že ObjectDataSource bude pracovat s daty uloženými v mezipaměti, může to být kvůli omezením paměti. Pokud není k dispozici dostatek volné paměti, data přidaná do mezipaměti objektem ObjectDataSource byla pravděpodobně vymycena. Pokud se zdá, že ObjectDataSource správně ukládá data do mezipaměti nebo je ukládá do mezipaměti pouze sporadicky, zavřete některé aplikace, abyste uvolnili paměť, a zkuste to znovu.
Obrázek 12 znázorňuje pracovní postup ukládání do mezipaměti ObjectDataSource. Když se na obrazovce zobrazí text aktivovaný událostí Výběr, je to proto, že data nebyla v mezipaměti a musela být načtena z podkladového objektu. Pokud ale tento text chybí, je to proto, že data byla k dispozici z mezipaměti. Když se data vrátí z mezipaměti, nedochází k žádnému volání základního objektu, a proto se nespustí žádný databázový dotaz.
Obrázek 12: ObjektDataSource ukládá a načítá data z mezipaměti dat
Každá aplikace ASP.NET má vlastní instanci mezipaměti dat, která se sdílí mezi všemi stránkami a návštěvníky. To znamená, že data uložená v mezipaměti dat objektem ObjectDataSource se sdílí také mezi všemi uživateli, kteří stránku navštíví. Chcete-li to ověřit, otevřete ObjectDataSource.aspx
stránku v prohlížeči. Při první návštěvě stránky se zobrazí text Výběr aktivovaný událostí (za předpokladu, že data přidaná do mezipaměti předchozími testy byla nyní vyřazena). Otevřete druhou instanci prohlížeče a zkopírujte a vložte adresu URL z první instance prohlížeče do druhé. Ve druhé instanci prohlížeče se nezobrazí text aktivovaný událostí Výběr, protože používá stejná data uložená v mezipaměti jako první.
Při vkládání načtených dat do mezipaměti objectDataSource používá hodnotu klíče mezipaměti, která zahrnuje CacheDuration
: hodnoty CacheExpirationPolicy
a vlastnosti; typ základního obchodního objektu, který používá ObjectDataSource, který je určen prostřednictvím TypeName
vlastnosti (ProductsBLL
v tomto příkladu); hodnota SelectMethod
vlastnosti a název a hodnoty parametrů v SelectParameters
kolekci; a hodnoty jeho StartRowIndex
vlastností a MaximumRows
vlastností, které se používají při implementaci vlastního stránkování.
Vytvoření hodnoty klíče mezipaměti jako kombinace těchto vlastností zajistí jedinečnou položku mezipaměti při změně těchto hodnot. Například v minulých kurzech jsme se zabývali používáním ProductsBLL
třídy s GetProductsByCategoryID(categoryID)
, která vrací všechny produkty pro zadanou kategorii. Jeden uživatel může přijít na stránku a zobrazit nápoje, které mají CategoryID
1. Pokud ObjectDataSource do mezipaměti své výsledky bez ohledu na SelectParameters
hodnoty, když jiný uživatel přišel na stránku, aby si prohlédl koření, zatímco nápojové produkty byly v mezipaměti, uvidí produkty nápojů v mezipaměti místo dochucení. Tím, že klíč mezipaměti liší podle těchto vlastností, které zahrnují hodnoty objektu SelectParameters
, ObjectDataSource udržuje samostatnou položku mezipaměti pro nápoje a koření.
Problémy se zastaralými daty
ObjectDataSource automaticky vyřadí své položky z mezipaměti při vyvolání některé z jeho Insert
metod , Update
nebo Delete
. To pomáhá chránit před zastaralými daty tím, že při úpravě dat prostřednictvím stránky vymaže položky mezipaměti. Je však možné, že ObjectDataSource, který používá ukládání do mezipaměti, stále zobrazuje zastaralá data. V nejjednodušším případě může být příčinou změna dat přímo v databázi. Správce databáze možná právě spustil skript, který upravuje některé záznamy v databázi.
Tento scénář by se také mohl odvíjet jemnějším způsobem. Zatímco ObjectDataSource vyřadí své položky z mezipaměti, když je volána jedna z jeho metod úpravy dat, odstraněné položky v mezipaměti jsou pro konkrétní kombinaci hodnot vlastností ObjectDataSource (CacheDuration
, TypeName
, SelectMethod
atd.). Pokud máte dva ObjectDataSources, které používají různé SelectMethods
nebo SelectParameters
, ale stále můžete aktualizovat stejná data, pak jeden ObjectDataSource může aktualizovat řádek a zneplatnit vlastní položky mezipaměti, ale odpovídající řádek pro druhý ObjectDataSource bude stále obsluhován z mezipaměti. Doporučuji vám, abyste vytvořili stránky, které budou tuto funkci vykazovat. Vytvořte stránku, která zobrazí upravitelný Objekt GridView, který načítá data z ObjectDataSource, který používá ukládání do mezipaměti a je nakonfigurován pro získání dat z ProductsBLL
metody třídy s GetProducts()
. Na tuto stránku (nebo jinou) přidejte další upravitelné objekty GridView a ObjectDataSource, ale pro tuto druhou objectDataSource použijte metodu GetProductsByCategoryID(categoryID)
. Vzhledem k tomu, že se dvě vlastnosti ObjectDataSources SelectMethod
liší, budou mít každá z nich své vlastní hodnoty uložené v mezipaměti. Pokud upravujete produkt v jedné mřížce, při příštím svážete data zpět s jinou mřížkou (stránkováním, řazením atd.), bude stále sloužit starým datům uloženým v mezipaměti a nebude odrážet změnu provedenou z druhé mřížky.
Stručně řečeno, vypršení platnosti založené na čase používejte pouze v případě, že jste ochotni mít potenciál zastaralých dat, a kratší vypršení platnosti používejte ve scénářích, ve kterých je důležitá aktuálnost dat. Pokud zastaralá data nejsou přijatelná, buď zakažte ukládání do mezipaměti, nebo použijte závislosti mezipaměti SQL (za předpokladu, že se jedná o data databáze, která ukládáte do mezipaměti). Závislosti mezipaměti SQL prozkoumáme v dalším kurzu.
Souhrn
V tomto kurzu jsme prozkoumali integrované možnosti ukládání do mezipaměti ObjectDataSource. Jednoduchým nastavením několika vlastností můžeme dát objektu ObjectDataSource pokyn, aby ukládaly výsledky vrácené ze zadaného SelectMethod
objektu do ASP.NET mezipaměti dat. Vlastnosti CacheDuration
a CacheExpirationPolicy
označují dobu, po kterou je položka uložena do mezipaměti a jestli se jedná o absolutní nebo posuvné vypršení platnosti. Vlastnost CacheKeyDependency
přidruží všechny položky mezipaměti ObjectDataSource s existující závislostí mezipaměti. Dá se použít k vyřazení položek ObjectDataSource z mezipaměti před dosažením vypršení platnosti na základě času a obvykle se používá se závislostmi mezipaměti SQL.
Vzhledem k tomu, že ObjectDataSource jednoduše ukládá své hodnoty do mezipaměti dat, mohli bychom programově replikovat integrovanou funkci ObjectDataSource. Nemá smysl to dělat na prezentační vrstvě, protože ObjectDataSource tuto funkci nabízí už od začátku, ale možnosti ukládání do mezipaměti můžeme implementovat v samostatné vrstvě architektury. Abychom to mohli udělat, budeme muset zopakovat stejnou logiku, kterou používá ObjectDataSource. V dalším kurzu se podíváme, jak programově pracovat s mezipamětí dat v rámci architektury.
Šťastné programování!
Další čtení
Další informace o tématech probíraných v tomto kurzu najdete v následujících zdrojích informací:
- ASP.NET ukládání do mezipaměti: Techniky a osvědčené postupy
- Průvodce architekturou ukládání do mezipaměti pro aplikace rozhraní .NET Framework
O autorovi
Scott Mitchell, autor sedmi knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Můžete ho najít na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na http://ScottOnWriting.NETadrese .
Zvláštní poděkování
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavní revidující pro tento kurz byla Teresa Murphy. Chcete si projít moje nadcházející články na WEBU MSDN? Pokud ano, dejte mi čáru na mitchell@4GuysFromRolla.comadresu .