Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V jakékoli webové aplikaci budou některá data často používána a některá data budou zřídka používána. Výkon naší ASP.NET aplikace můžeme zlepšit tím, že předem načteme často používaná data, což je technika známá jako. Tento kurz ukazuje jeden přístup k proaktivnímu načítání, což je načtení dat do mezipaměti při spuštění aplikace.
Úvod
V předchozích dvou kurzech jsme se podívali na ukládání 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í prvku ObjectDataSource jsme se podívali na použití funkcí ukládání do mezipaměti prvku ObjectDataSource k ukládání dat do mezipaměti v prezentační vrstvě. Ukládání dat do mezipaměti v architektuře zkoumá ukládání do mezipaměti v nové, samostatné mezipaměťové vrstvě. Oba tyto kurzy používaly reaktivní načítání při práci s mezipamětí dat. Při reaktivním načítání systém při každém požadavku na data nejprve zkontroluje, zda se nacházejí v mezipaměti. Pokud ne, vezme data z původního zdroje, jako je například databáze, a uloží je do mezipaměti. Hlavní výhodou reaktivního načítání je jeho snadná implementace. Jednou z jejích nevýhod je nerovnoměrný výkon napříč jednotlivými 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. Když se tato stránka poprvé navštíví nebo se poprvé navštíví po vyřazení dat uložených v mezipaměti z důvodu omezení paměti nebo dosažení zadané vypršení platnosti, musí se data načíst z databáze. Proto tyto požadavky uživatelů budou trvat déle než požadavky uživatelů, které mohou být obsluhovány mezipamětí.
Proaktivní načítání poskytuje alternativní strategii správy mezipaměti, která vyhlazuje 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, pokud došlo k aktualizaci podkladových dat. Tento proces pak aktualizuje mezipaměť, aby byla aktuální. Proaktivní načítání je užitečné zejména v případě, že podkladová data pocházejí z pomalého připojení k databázi, webové služby nebo jiného zvlášť 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, který kontroluje změny a aktualizuje mezipaměť.
Další příchuť proaktivního načítání a typ, který v tomto kurzu prozkoumáme, je načítání dat do mezipaměti při spuštění aplikace. Tento přístup je užitečný zejména 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 seznamem výhod, nevýhod a doporučení k implementaci najdete v části Správa obsahu mezipamětiprůvodce 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 nevytváří se přehnaně dlouho. Pokud se ale data uložená v mezipaměti nikdy nezmění, je vypršení platnosti používané reaktivním načítáním nadbytečné. Podobně platí, že pokud generování dat pro mezipaměť trvá velmi dlouho, budou muset uživatelé, jejichž požadavky narazí na prázdnou mezipaměť, vydržet dlouhé čekání na načtení podkladových dat. Zvažte ukládání statických dat a dat, jejichž generování při spuštění aplikace trvá mimořádně dlouho, do mezipaměti.
I když databáze mají mnoho dynamických, často se měnících hodnot, většina 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í určitou hodnotu z pevné sady voleb.
Patients Tabulka databáze může mít 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. Namísto uložení řetězce v angličtině nebo francouzštině do tabulky Patients se vytvoří alternativní druhá tabulka, která běžně obsahuje dva sloupce – jedinečný identifikátor a popis řetězce – s jednotlivými záznamy pro každou možnou hodnotu řetězce. 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 Johna Doea angličtina, zatímco Ed Johnson 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ů naplně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 Languages tabulku. To je plýtvání a zbytečné, protože hodnoty vyhledávací tabulky se mění velmi zřídka, pokud vůbec někdy.
Data bychom mohli ukládat do mezipaměti Languages pomocí stejných reaktivních metod načítání, které jsme prozkoumali v předchozích kurzech. Reaktivní načítání ale používá vypršení časového limitu, který není nutný pro statická data vyhledávací tabulky. I když by ukládání do mezipaměti pomocí reaktivního načítání bylo lepší než žádné ukládání do mezipaměti, nejlepším přístupem 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, jak ukládat data vyhledávací tabulky do mezipaměti a další statické informace.
Krok 2: Zkoumání různých způsobů ukládání dat do mezipaměti
Informace je možné programově ukládat do mezipaměti v aplikaci ASP.NET pomocí různých přístupů. Už jsme viděli, jak používat mezipaměť dat v předchozích kurzech. Objekty lze také programově ukládat do mezipaměti pomocí statických členů nebo stavu aplikace.
Při práci s třídou je obvykle nutné nejprve vytvořit instanci třídy, aby bylo možné získat přístup k jejím členům. Abychom například mohli 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ž budeme moci vyvolat SomeMethod nebo pracovat s SomeProperty, musíme nejprve vytvořit instanci třídy pomocí klíčového New slova.
NěkteréMethod a SomeProperty jsou přidruženy k určité 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, dokud 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á ASP.NET aplikace udržuje kolekci názvů a hodnot, která je sdílena mezi všemi uživateli a stránkami aplikace. K této kolekci lze přistupovat pomocí HttpContext vlastnosti class s Applicationa používat ji z třídy s kódem na pozadí stránky ASP.NET 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 diskutabilní. V tomto kurzu se podíváme na kód, který používá všechny tři techniky pro ukládání statických dat do mezipaměti.
Krok 3: Ukládání dat tabulky doSuppliersmezipaměti
Databázové tabulky Northwind, které jsme implementovali k datu, nezahrnují žádné tradiční vyhledávací tabulky. Čtyři datové tabulky implementované v naší DAL modelují tabulky, jejichž hodnoty nejsou statické. Místo toho, abyste strávili čas přidáním nové tabulky DataTable do DAL a pak nové třídy a metod do knihoven BLL, pojďme v tomto kurzu předstírat, že Suppliers data tabulky jsou statická. Proto bychom tato data mohli ukládat do mezipaměti při spuštění aplikace.
Začněte vytvořením nové třídy pojmenované 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é vracejí 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 LoadStaticCache() z metody. Metoda LoadStaticCache() je určena k volání při startu aplikace. Jakmile jsou tato data načtena při spuštění aplikace, může jakákoli stránka, která potřebuje pracovat s daty dodavatele StaticCache , volat metodu třídy s GetSuppliers() . Proto volání databáze k získání dodavatelů proběhne pouze jednou při spuštění aplikace.
Místo použití statické členské proměnné jako úložiště mezipaměti bychom mohli případně použít stav aplikace nebo mezipaměť dat. Následující kód ukazuje třídu přepracovanou pro použití stavu 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
Informace LoadStaticCache()o dodavateli jsou uloženy do klíče proměnné aplikace. Vrátí se jako příslušný typ (Northwind.SuppliersDataTable) z GetSuppliers(). I když je stav aplikace přístupný ve třídách kódu 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ě lze 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í časového limitu, použijte System.Web.Caching.Cache.NoAbsoluteExpiration hodnoty a System.Web.Caching.Cache.NoSlidingExpiration hodnoty jako vstupní parametry. Toto konkrétní přetížení metody mezipaměti dat 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 vysunout, když je dostupná paměť nízká. Tady použijeme prioritu NotRemovable, která zajistí, že tato položka mezipaměti nebude odstraněna.
Poznámka:
Tento soubor ke stažení kurzu implementuje třídu StaticCache pomocí přístupu ke 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 žádosti a zde 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 adresáře Global.asax webové aplikace tak, že kliknete pravým tlačítkem myši na název projektu webu v Průzkumník řešení sady Visual Studio a zvolíte Přidat novou položku. V dialogovém okně Přidat novou položku vyberte typ položky globální třídy aplikace a klikněte na tlačítko Přidat.
Poznámka:
Pokud již máte soubor Global.asax ve vašem projektu, typ položky třídy globální aplikace nebude uveden v dialogovém okně Přidat novou položku.
Obrázek 3: Přidání souboru do kořenového adresáře Global.asax 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_Startspustí se při prvním spuštění webové aplikace. -
Application_Endspustí se, když se aplikace vypne. -
Application_Errorse spustí vždy, když neřešená výjimka dosáhne aplikace. - Při vytvoření nové relace se
Session_Startspustí. -
Session_Endspustí se při vypršení platnosti nebo opuštění relace.
Obslužná Application_Start rutina události je volána pouze jednou během životního cyklu aplikace. Aplikace se spustí poprvé, když se od aplikace vyžádá ASP.NET prostředek a bude se spouštět, dokud se aplikace nerestartuje, což se může stát úpravou obsahu /Bin složky, úpravou Global.asax, úpravou obsahu ve App_Code složce nebo úpravou Web.config souboru mimo jiné. Podrobnější informace o životním cyklu aplikace najdete v tématu ASP.NET Přehled životního cyklu aplikace.
V těchto kurzech potřebujeme do Application_Start metody přidat jenom kód, takže ostatní můžete odebrat. V Application_Start, jednoduše zavolejte StaticCache metodu třídy s LoadStaticCache() , která načte a uloží do mezipaměti informace o dodavateli:
<%@ 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šechno, co je na tom! Při spuštění aplikace LoadStaticCache() metoda vezme informace o dodavateli z BLL a uloží je do statické členské proměnné (nebo libovolného úložiště mezipaměti, které jste použili ve třídě StaticCache). Pokud chcete toto chování ověřit, nastavte v Application_Start metodě zarážku a spusťte aplikaci. Všimněte si, že bod zarážky se aktivuje hned při spuštění aplikace. Následné požadavky však nezpůsobí spuštění metody Application_Start.
Obrázek 4: Použití zarážky k ověření Application_Start spuštění obslužné rutiny události (kliknutím zobrazíte obrázek 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 již byla spuštěna. Vynuťte restartování aplikace úpravou Global.asax souborů nebo Web.config souborů a akci opakujte. Na konec jednoho z těchto souborů můžete jednoduše přidat (nebo odebrat) prázdný řádek a rychle restartovat aplikaci.
Krok 5: Zobrazení dat uložených v mezipaměti
V tomto okamžiku StaticCache má třída verzi dat dodavatele uložená v mezipaměti při spuštění aplikace, ke které lze přistupovat prostřednictvím své GetSuppliers() metody. Pro práci s těmito daty z prezentační vrstvy můžeme použít ObjectDataSource nebo programově vyvolat StaticCache metodu class s GetSuppliers() z třídy s kódem na pozadí ASP.NET stránky. Podívejme se na použití ovládacích prvků ObjectDataSource a GridView k zobrazení informací o dodavateli uložených 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ření nového prvku ObjectDataSource s názvem SuppliersCachedDataSource. Nakonfigurujte ObjectDataSource tak, aby používal metodu StaticCache třídy s GetSuppliers() .
Obrázek 5: Konfigurace ObjectDataSource pro použití StaticCache třídy (kliknutím zobrazíte obrázek s plnou velikostí)
Obrázek 6: Použití GetSuppliers() metody k načtení dat dodavatele v mezipaměti (kliknutím zobrazíte obrázek s plnou velikostí)
Po dokončení průvodce Visual Studio automaticky přidá BoundFields pro každé z datových polí v SuppliersDataTable. Deklarativní kód GridView a ObjectDataSource by měl vypadat podobně jako následující:
<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 prohlížení v prohlížeči. Výstup je stejný, jako kdybychom převzali data z třídy BLL SuppliersBLL , ale použití StaticCache třídy vrátí data dodavatele jako uložená do mezipaměti při spuštění aplikace. Pro ověření tohoto chování můžete nastavit zarážky v metodě StaticCache class s GetSuppliers() .
Obrázek 7: Data dodavatele uložená v mezipaměti se zobrazují v objektu GridView (kliknutím zobrazíte obrázek v plné velikosti).
Shrnutí
Většina datových modelů obsahuje poměrně velké množství statických dat, obvykle implementovaných ve formě vyhledávacích tabulek. Vzhledem k tomu, že tyto informace jsou statické, není důvod neustále přistupovat do databáze pokaždé, když je třeba tyto informace zobrazit. Navíc vzhledem ke své statické povaze není při ukládání dat do mezipaměti potřeba vypršení platnosti. V tomto kurzu jsme viděli, jak taková data vzít a uložit je do mezipaměti dat, stavu aplikace a prostřednictvím statické členské proměnné. Tyto informace jsou ukládány 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 poslední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 ale může být vypršení časového limitu menší než ideální. Místo pravidelného vyprázdnění mezipaměti by bylo optimální vyřadit položku uloženou v mezipaměti pouze při úpravě podkladových dat databáze. Toto ideální řešení je možné prostřednictvím závislostí mezipaměti SQL, které si probereme v dalším kurzu.
Šťastné programování!
O autorovi
Scott Mitchell, autor sedmi knih ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams: Nauč se ASP.NET 2.0 za 24 hodin. Může být dosažitelný na mitchell@4GuysFromRolla.comadrese .
Zvláštní díky
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Vedoucí hodnotící tohoto kurzu byli Teresa Murphy a Zack Jones. Chcete si projít nadcházející články MSDN? Pokud ano, napište mi zprávu na mitchell@4GuysFromRolla.com.