Sdílet prostřednictvím


Ukládání dat do mezipaměti při spuštění aplikace (VB)

Scott Mitchell

Stáhnout PDF

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.

Tabulka Jazyků je vyhledávací tabulka používaná tabulkou Pacienti.

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 Applicationa 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 doSuppliersmezipamě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.

Vytvoření třídy StaticCache.vb ve složce CL

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.

Přidání souboru Global.asax do kořenového adresáře webové aplikace

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.asaxobsahu 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_Startná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.

Pomocí zarážky ověřte, že se spouští obslužná rutina události Application_Start.

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() .

Konfigurace ObjectDataSource pro použití třídy StaticCache

Obrázek 5: Konfigurace objektu ObjectDataSource pro použití StaticCache třídy (kliknutím zobrazíte obrázek v plné velikosti)

Použití metody GetSuppliers() k načtení dat dodavatele v mezipaměti

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í.

Data dodavatele uložená v mezipaměti se zobrazují v zobrazení GridView.

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 .