Ukládání dat do mezipaměti při spuštění aplikace (VB)
V jakékoli webové aplikaci se budou některá data často používat a některá se budou používat jen zřídka. Výkon naší aplikace ASP.NET můžeme zlepšit tak, že předem načítáme často používaná data, která se označuje jako technika. Tento kurz ukazuje jeden přístup k proaktivnímu načítání, kterým je načtení dat do mezipaměti při spuštění aplikace.
Úvod
Dva předchozí kurzy se zabývaly ukládáním dat do mezipaměti ve vrstvách prezentace a ukládání do mezipaměti. V části Ukládání dat do mezipaměti pomocí ObjectDataSource jsme se podívali na použití funkcí ukládání do mezipaměti ObjectDataSource k ukládání dat do mezipaměti v prezentační vrstvě. Ukládání dat do mezipaměti v architektuře prozkoumalo ukládání do mezipaměti v nové samostatné vrstvě ukládání do mezipaměti. V obou těchto kurzech se při práci s mezipamětí dat použilo reaktivní načítání . Při reaktivním načítání systém při každém vyžádání dat nejprve zkontroluje, jestli jsou v mezipaměti. Pokud ne, vezme data z původního zdroje, například z databáze, a pak je uloží do mezipaměti. Hlavní výhodou reaktivního načítání je jeho snadná implementace. Jednou z jeho nevýhod je nerovnoměrný výkon napříč požadavky. Představte si stránku, která používá vrstvu ukládání do mezipaměti z předchozího kurzu k zobrazení informací o produktu. Při první návštěvě této stránky nebo při první návštěvě po vyřazení dat v mezipaměti z důvodu omezení paměti nebo dosažení zadaného vypršení platnosti musí být data načtena z databáze. Proto budou tyto žádosti uživatelů trvat déle než požadavky uživatelů, které může mezipaměť obsluhovat.
Proaktivní načítání poskytuje alternativní strategii správy mezipaměti, která vyrovnává výkon napříč požadavky tím, že načítá data uložená v mezipaměti dříve, než je potřeba. Proaktivní načítání obvykle používá nějaký proces, který buď pravidelně kontroluje, nebo je upozorněn, když došlo k aktualizaci podkladových dat. Tento proces pak aktualizuje mezipaměť, aby byla stále aktuální. Proaktivní načítání je užitečné zejména v případě, že podkladová data pocházejí z pomalého databázového připojení, webové služby nebo jiného obzvláště pomalého zdroje dat. Tento přístup k proaktivnímu načítání je ale obtížnější implementovat, protože vyžaduje vytvoření, správu a nasazení procesu kontroly změn a aktualizace mezipaměti.
Další variantou proaktivního načítání a typem, který budeme zkoumat v tomto kurzu, je načítání dat do mezipaměti při spuštění aplikace. Tento přístup je zvláště užitečný pro ukládání statických dat do mezipaměti, jako jsou záznamy ve vyhledávacích tabulkách databáze.
Poznámka
Podrobnější pohled na rozdíly mezi proaktivním a reaktivním načítáním a seznam výhod, záporů a doporučení k implementaci najdete v části Správa obsahu mezipamětiv průvodci architekturou ukládání do mezipaměti pro aplikace rozhraní .NET Framework.
Krok 1: Určení dat, která se mají ukládat do mezipaměti při spuštění aplikace
Příklady ukládání do mezipaměti s využitím reaktivního načítání, které jsme prozkoumali v předchozích dvou kurzech, dobře fungují s daty, která se mohou pravidelně měnit a jejich generování netrvá příliš dlouho. Pokud se ale data uložená v mezipaměti nikdy nezmění, je vypršení platnosti použité reaktivním načítáním nadbytečné. Podobně platí, že pokud generování dat uložených v mezipaměti trvá příliš dlouho, pak uživatelé, jejichž požadavky zjistí, že mezipaměť je prázdná, budou muset na načtení podkladových dat vydržet dlouhé čekání. Zvažte ukládání statických dat a dat do mezipaměti, které trvá mimořádně dlouho, než se vygenerují při spuštění aplikace.
I když databáze mají mnoho dynamických a často se měnících hodnot, většina z nich má také poměrně velké množství statických dat. Například prakticky všechny datové modely mají jeden nebo více sloupců, které obsahují konkrétní hodnotu z pevné sady voleb. Tabulka Patients
databáze může obsahovat PrimaryLanguage
sloupec, jehož sada hodnot může být angličtina, španělština, francouzština, ruština, japonština atd. Tyto typy sloupců se často implementují pomocí vyhledávacích tabulek. Místo uložení řetězce v angličtině nebo francouzštině v Patients
tabulce se vytvoří druhá tabulka, která má obvykle dva sloupce – jedinečný identifikátor a popis řetězce – se záznamem pro každou možnou hodnotu. Sloupec PrimaryLanguage
v Patients
tabulce ukládá odpovídající jedinečný identifikátor ve vyhledávací tabulce. Na obrázku 1 je primárním jazykem pacienta John Doe angličtina, zatímco Ed Johnson s je ruština.
Obrázek 1: Tabulka Languages
je vyhledávací tabulka používaná tabulkou Patients
Uživatelské rozhraní pro úpravy nebo vytvoření nového pacienta by obsahovalo rozevírací seznam povolených jazyků vyplněných záznamy v Languages
tabulce. Bez ukládání do mezipaměti musí systém pokaždé, když je toto rozhraní navštíveno, dotazovat tabulku Languages
. To je zbytečné a zbytečné, protože hodnoty vyhledávací tabulky se mění velmi zřídka, pokud vůbec.
Data bychom mohli ukládat do Languages
mezipaměti pomocí stejných technik reaktivního načítání, které jsme prozkoumali v předchozích kurzech. Reaktivní načítání ale používá vypršení platnosti na základě času, které není potřeba pro data statické vyhledávací tabulky. I když ukládání do mezipaměti pomocí reaktivního načítání by bylo lepší než ukládání do mezipaměti vůbec, nejlepší by bylo proaktivně načíst data vyhledávací tabulky do mezipaměti při spuštění aplikace.
V tomto kurzu se podíváme na to, jak ukládat data vyhledávací tabulky do mezipaměti a další statické informace.
Krok 2: Prozkoumání různých způsobů ukládání dat do mezipaměti
Informace se dají programově ukládat do mezipaměti v ASP.NET aplikaci pomocí různých přístupů. V předchozích kurzech jsme už viděli, jak používat mezipaměť dat. Alternativně lze objekty ukládat do mezipaměti prostřednictvím kódu programu pomocí statických členů nebo stavu aplikace.
Při práci s třídou se obvykle musí nejprve vytvořit instance třídy, aby bylo možné získat přístup k jejím členům. Pokud například chcete vyvolat metodu z jedné z tříd v naší vrstvě obchodní logiky, musíme nejprve vytvořit instanci třídy:
Dim productsAPI As New ProductsBLL()
productsAPI.SomeMethod()
productsAPI.SomeProperty = "Hello, World!"
Než můžeme vyvolat SomeMethod nebo pracovat s SomeProperty, musíme nejprve vytvořit instanci třídy pomocí klíčového New
slova. SomeMethod a SomeProperty jsou přidruženy ke konkrétní instanci. Životnost těchto členů je svázaná s životností jejich přidruženého objektu. Statické členy jsou na druhé straně proměnné, vlastnosti a metody, které jsou sdíleny mezi všemi instancemi třídy, a v důsledku toho mají životnost tak dlouho jako třída. Statické členy jsou označeny klíčovým slovem Shared
.
Kromě statických členů je možné data ukládat do mezipaměti pomocí stavu aplikace. Každá aplikace ASP.NET udržuje kolekci názvů a hodnot, která se sdílí mezi všemi uživateli a stránkami aplikace. K této kolekci je možné přistupovat pomocí HttpContext
vlastnosti třídy s Application
a používat ji z třídy kódu stránky s ASP.NET, například takto:
Application("key") = value
Dim value As Object = Application("key")
Mezipaměť dat poskytuje mnohem bohatší rozhraní API pro ukládání dat do mezipaměti, poskytuje mechanismy pro vypršení platnosti na základě času a závislostí, priority položek mezipaměti atd. U statických členů a stavu aplikace musí vývojář stránky tyto funkce přidat ručně. Při ukládání dat do mezipaměti při spuštění aplikace po celou dobu životnosti aplikace jsou však výhody mezipaměti dat moot. V tomto kurzu se podíváme na kód, který používá všechny tři techniky ukládání statických dat do mezipaměti.
Krok 3: Ukládání dat tabulky doSuppliers
mezipaměti
Databázové tabulky Northwind, které jsme k dnešnímu dni implementovali, neobsahují žádné tradiční vyhledávací tabulky. Čtyři tabulky datatable implementované v našich tabulkách modelů DAL, jejichž hodnoty nejsou statické. Místo toho, abyste strávili čas přidáním nové tabulky DataTable do DAL a pak novou třídu a metody do BLL, v tomto kurzu jen předstírejme, že Suppliers
data tabulky jsou statická. Proto bychom mohli tato data ukládat do mezipaměti při spuštění aplikace.
Začněte vytvořením nové třídy s názvem StaticCache.cs
ve CL
složce.
Obrázek 2: Vytvoření StaticCache.vb
třídy ve CL
složce
Potřebujeme přidat metodu, která načte data při spuštění do příslušného úložiště mezipaměti, a také metody, které vrací data z této mezipaměti.
<System.ComponentModel.DataObject()> _
Public Class StaticCache
Private Shared suppliers As Northwind.SuppliersDataTable = Nothing
Public Shared Sub LoadStaticCache()
' Get suppliers - cache using a static member variable
Dim suppliersBLL As New SuppliersBLL()
suppliers = suppliersBLL.GetSuppliers()
End Sub
<DataObjectMethodAttribute(DataObjectMethodType.Select, True)> _
Public Shared Function GetSuppliers() As Northwind.SuppliersDataTable
Return suppliers
End Function
End Class
Výše uvedený kód používá statickou členskou proměnnou suppliers
, k uložení výsledků z SuppliersBLL
metody třídy s GetSuppliers()
, která je volána z LoadStaticCache()
metody . Metoda LoadStaticCache()
se má volat během spuštění aplikace. Po načtení těchto dat při spuštění aplikace může jakákoli stránka, která potřebuje pracovat s daty dodavatele, volat metodu StaticCache
třídy s GetSuppliers()
. Proto volání do databáze pro získání dodavatelů probíhá pouze jednou, při spuštění aplikace.
Místo použití statické členské proměnné jako úložiště mezipaměti bychom mohli alternativně použít stav aplikace nebo mezipaměť dat. Následující kód ukazuje třídu přeuskutečněnou tak, aby používala stav aplikace:
<System.ComponentModel.DataObject()> _
Public Class StaticCache
Public Shared Sub LoadStaticCache()
' Get suppliers - cache using application state
Dim suppliersBLL As New SuppliersBLL()
HttpContext.Current.Application("key") = suppliers
End Sub
<DataObjectMethodAttribute(DataObjectMethodType.Select, True)> _
Public Shared Function GetSuppliers() As Northwind.SuppliersDataTable
Return TryCast(HttpContext.Current.Application("key"), _
Northwind.SuppliersDataTable)
End Function
End Class
V LoadStaticCache()
nástroji se informace o dodavateli ukládají do klíče proměnné aplikace. Vrátí se jako odpovídající typ (Northwind.SuppliersDataTable
) z GetSuppliers()
. I když je stav aplikace přístupný ve třídách kódu na pozadí ASP.NET stránek pomocí Application("key")
, v architektuře musíme použít HttpContext.Current.Application("key")
, abychom získali aktuální HttpContext
.
Podobně je možné mezipaměť dat použít jako úložiště mezipaměti, jak ukazuje následující kód:
<System.ComponentModel.DataObject()> _
Public Class StaticCache
Public Shared Sub LoadStaticCache()
' Get suppliers - cache using a static member variable
Dim suppliersBLL As New SuppliersBLL()
HttpRuntime.Cache.Insert("key", suppliers, Nothing, _
Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, _
CacheItemPriority.NotRemovable, Nothing)
End Sub
<System.ComponentModel.DataObjectMethodAttribute_
(System.ComponentModel.DataObjectMethodType.Select, True)> _
Public Shared Function GetSuppliers() As Northwind.SuppliersDataTable
Return TryCast(HttpRuntime.Cache("key"), Northwind.SuppliersDataTable)
End Function
End Class
Pokud chcete přidat položku do mezipaměti dat bez vypršení platnosti na základě času, použijte System.Web.Caching.Cache.NoAbsoluteExpiration
jako vstupní parametry hodnoty a System.Web.Caching.Cache.NoSlidingExpiration
. Toto konkrétní přetížení metody mezipaměti dat s Insert
bylo vybráno, abychom mohli určit prioritu položky mezipaměti. Priorita se používá k určení položek, které se mají z mezipaměti vymýt, když je nedostatek dostupné paměti. Tady použijeme prioritu NotRemovable
, která zajistí, že se tato položka mezipaměti nevymytí.
Poznámka
Tento kurz ke stažení implementuje StaticCache
třídu pomocí přístupu statické členské proměnné. Kód pro techniky stavu aplikace a mezipaměti dat je k dispozici v komentářích v souboru třídy.
Krok 4: Spuštění kódu při spuštění aplikace
Abychom mohli spustit kód při prvním spuštění webové aplikace, musíme vytvořit speciální soubor s názvem Global.asax
. Tento soubor může obsahovat obslužné rutiny událostí pro události na úrovni aplikace, relace a požadavku a tady můžeme přidat kód, který se spustí při každém spuštění aplikace.
Přidejte soubor do kořenového Global.asax
adresáře webové aplikace tak, že v Průzkumník řešení sady Visual Studio kliknete pravým tlačítkem na název webového projektu a zvolíte Přidat novou položku. V dialogovém okně Přidat novou položku vyberte typ položky Globální třída aplikace a klikněte na tlačítko Přidat.
Poznámka
Pokud již Global.asax
máte soubor v projektu, typ položky Globální třída aplikace nebude uveden v dialogovém okně Přidat novou položku.
Obrázek 3: Přidání souboru do kořenového Global.asax
adresáře webové aplikace (kliknutím zobrazíte obrázek v plné velikosti)
Výchozí Global.asax
šablona souboru obsahuje pět metod v rámci značky na straně <script>
serveru:
Application_Start
spustí se při prvním spuštění webové aplikace.Application_End
spustí, když se aplikace vypíná.Application_Error
spustí se pokaždé, když aplikace dosáhne neošetřené výjimky.Session_Start
spustí se při vytvoření nové relace.Session_End
Spustí se, když vypršela platnost relace nebo je opuštěná.
Obslužná rutina Application_Start
události se volá pouze jednou během životního cyklu aplikace. Aplikace se spustí při prvním vyžádání prostředku ASP.NET z aplikace a poběží až do restartování aplikace. K tomu může dojít mimo jiné úpravou obsahu /Bin
složky, úpravou Global.asax
obsahu App_Code
ve složce nebo úpravou Web.config
souboru. Podrobnější informace o životním cyklu aplikace najdete v ASP.NET Přehled životního cyklu aplikace.
V těchto kurzech stačí přidat kód do Application_Start
metody, takže ostatní odeberte. V Application_Start
nástroji jednoduše zavolejte metodu StaticCache
třídy s LoadStaticCache()
, která načte informace o dodavateli a uloží je do mezipaměti:
<%@ Application Language="VB" %>
<script runat="server">
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
StaticCache.LoadStaticCache()
End Sub
</script>
To je vše, co k tomu patří! Při spuštění LoadStaticCache()
aplikace metoda vezme informace o dodavateli z BLL a uloží je do proměnné statického člena (nebo jakéhokoli úložiště mezipaměti, které jste nakonec používali StaticCache
ve třídě). Pokud chcete toto chování ověřit, nastavte v Application_Start
metodě zarážku a spusťte aplikaci. Všimněte si, že při spuštění aplikace dojde k dosažení zarážky. Následné požadavky však nezpůsobí Application_Start
spuštění metody.
Obrázek 4: Použití zarážky k ověření spouštění Application_Start
obslužné rutiny události (kliknutím zobrazíte obrázek v plné velikosti)
Poznámka
Pokud při prvním spuštění ladění nenarazíte na Application_Start
zarážku, je to proto, že vaše aplikace už byla spuštěna. Vynuťte restartování aplikace úpravou souborů nebo Web.config
a akci opakujteGlobal.asax
. Pokud chcete aplikaci rychle restartovat, můžete jednoduše přidat (nebo odebrat) prázdný řádek na konec jednoho z těchto souborů.
Krok 5: Zobrazení dat v mezipaměti
V tomto okamžiku StaticCache
má třída verzi dat dodavatele uloženou v mezipaměti při spuštění aplikace, ke které je možné přistupovat prostřednictvím její GetSuppliers()
metody. Pro práci s těmito daty z prezentační vrstvy můžeme použít ObjectDataSource nebo programově vyvolat metodu StaticCache
třídy s GetSuppliers()
z třídy kódu ASP.NET stránky s kódem na pozadí. Pojďme se podívat na použití ObjectDataSource a GridView ovládacích prvků k zobrazení informací o dodavateli v mezipaměti.
Začněte otevřením AtApplicationStartup.aspx
stránky ve Caching
složce. Přetáhněte objekt GridView z panelu nástrojů do návrháře a nastavte jeho ID
vlastnost na Suppliers
. Dále z inteligentní značky GridView zvolte vytvořit nový ObjectDataSource s názvem SuppliersCachedDataSource
. Nakonfigurujte ObjectDataSource tak, aby používal metodu StaticCache
třídy s GetSuppliers()
.
Obrázek 5: Konfigurace objektu ObjectDataSource pro použití StaticCache
třídy (kliknutím zobrazíte obrázek v plné velikosti)
Obrázek 6: Použití GetSuppliers()
metody k načtení dat dodavatele v mezipaměti (kliknutím zobrazíte obrázek v plné velikosti)
Po dokončení průvodce sada Visual Studio automaticky přidá BoundFields pro každé z datových polí v nástroji SuppliersDataTable
. Deklarativní značky GridView a ObjectDataSource by měly vypadat nějak takto:
<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False"
DataKeyNames="SupplierID" DataSourceID="SuppliersCachedDataSource"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="SupplierID" HeaderText="SupplierID"
InsertVisible="False" ReadOnly="True"
SortExpression="SupplierID" />
<asp:BoundField DataField="CompanyName" HeaderText="CompanyName"
SortExpression="CompanyName" />
<asp:BoundField DataField="Address" HeaderText="Address"
SortExpression="Address" />
<asp:BoundField DataField="City" HeaderText="City"
SortExpression="City" />
<asp:BoundField DataField="Country" HeaderText="Country"
SortExpression="Country" />
<asp:BoundField DataField="Phone" HeaderText="Phone"
SortExpression="Phone" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersCachedDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetSuppliers" TypeName="StaticCache" />
Obrázek 7 znázorňuje stránku při zobrazení v prohlížeči. Výstup je stejný, pokud jsme data vytáhli z třídy BLL s SuppliersBLL
, ale použití StaticCache
třídy vrátí data dodavatele jako uložená v mezipaměti při spuštění aplikace. Můžete nastavit zarážky v StaticCache
metodě třídy s GetSuppliers()
k ověření tohoto chování.
Obrázek 7: Data dodavatele uložená v mezipaměti se zobrazují v zobrazení GridView (kliknutím zobrazíte obrázek v plné velikosti)
Souhrn
Většina každého datového modelu obsahuje poměrně velké množství statických dat, obvykle implementovaných ve formě vyhledávacích tabulek. Vzhledem k tomu, že jsou tyto informace statické, není důvod k neustálému přístupu k databázi pokaždé, když je potřeba tyto informace zobrazit. Vzhledem k jeho statické povaze navíc není při ukládání dat do mezipaměti potřeba vypršení platnosti. V tomto kurzu jsme viděli, jak taková data převzít a uložit je do mezipaměti dat, stavu aplikace a prostřednictvím statické členské proměnné. Tyto informace se ukládají do mezipaměti při spuštění aplikace a zůstávají v mezipaměti po celou dobu životnosti aplikace.
V tomto kurzu a v předchozích dvou jsme se podívali na ukládání dat do mezipaměti po dobu životnosti aplikace a také na použití vypršení platnosti na základě času. Při ukládání dat databáze do mezipaměti však může být vypršení platnosti založené na čase menší než ideální. Místo pravidelného vyprázdnění mezipaměti by bylo optimální vyřadit položku v mezipaměti pouze při změně podkladových dat databáze. Tento ideální způsob je možný pomocí závislostí mezipaměti SQL, které prozkoumáme v dalším kurzu.
Šťastné programování!
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ími recenzenty tohoto kurzu byli Teresa Murphy a Zack Jones. Chcete si projít moje nadcházející články na WEBU MSDN? Pokud ano, dejte mi čáru na mitchell@4GuysFromRolla.comadresu .