Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
door Scott Mitchell
Caching kan het verschil betekenen tussen een trage en snelle webtoepassing. Deze handleiding is de eerste van vier die een gedetailleerde blik werpen op caching in ASP.NET. Leer de belangrijkste concepten van caching en hoe u caching toepast op de presentatielaag via het besturingselement ObjectDataSource.
Introductie
In de informatica is caching het proces waarbij gegevens of informatie die lastig en kostbaar te verkrijgen zijn, worden opgeslagen op een locatie die sneller toegankelijk is. Voor gegevensgestuurde toepassingen verbruiken grote en complexe query's meestal het merendeel van de uitvoeringstijd van de toepassing. Dergelijke prestaties van een toepassing kunnen vervolgens vaak worden verbeterd door de resultaten van dure databasequery's op te slaan in het geheugen van de toepassing.
ASP.NET 2.0 biedt diverse cacheopties. Een volledige webpagina of gerenderde opmaak van Gebruikersbeheer kan in de cache worden opgeslagen via uitvoercaching. De besturingselementen ObjectDataSource en SqlDataSource bieden ook cachingmogelijkheden, waardoor gegevens op besturingsniveau in de cache kunnen worden opgeslagen. En ASP.NET gegevenscache biedt een uitgebreide cache-API waarmee paginaontwikkelaars programmatisch objecten kunnen cachen. In deze zelfstudie en de volgende drie onderzoeken we het gebruik van de cachefuncties van ObjectDataSource en de gegevenscache. We verkennen ook hoe u toepassingsbrede gegevens bij het opstarten in de cache kunt opslaan en hoe u gegevens in de cache actueel kunt houden door gebruik te maken van SQL-cacheafhankelijkheden. In deze zelfstudies wordt de uitvoercache niet verkend. Zie Uitvoercache in ASP.NET 2.0 voor een gedetailleerd overzicht van de uitvoercache.
Caching kan op elke plaats in de architectuur worden toegepast, vanaf de Data Access-laag tot en met de presentatielaag. In deze handleiding kijken we naar het toepassen van caching op de Presentatielaag via het besturingselement ObjectDataSource. In de volgende handleiding zullen we het cachen van gegevens in de bedrijfslogicalaag onderzoeken.
Belangrijke concepten voor opslaan in cache
Caching kan de algehele prestaties en schaalbaarheid van een toepassing aanzienlijk verbeteren door gegevens te nemen die duur zijn om een kopie ervan te genereren en op te slaan op een locatie die efficiënter kan worden geopend. Omdat de cache slechts een kopie van de werkelijke, onderliggende gegevens bevat, kan deze verouderd of verouderd raken als de onderliggende gegevens veranderen. Om dit te voorkomen, kan een paginaontwikkelaar criteria aangeven waarmee het cache-item wordt verwijderd uit de cache, met behulp van:
- Criteria op basis van tijd kunnen worden toegevoegd aan de cache voor een absolute of glijdende duur. Een paginaontwikkelaar kan bijvoorbeeld een duur van bijvoorbeeld 60 seconden aangeven. Met een absolute duur wordt het item in de cache 60 seconden verwijderd nadat het aan de cache is toegevoegd, ongeacht hoe vaak het is geopend. Met een schuifduur wordt het item in de cache 60 seconden na de laatste toegang verwijderd.
- Criteria op basis van afhankelijkheden kunnen worden gekoppeld aan een item wanneer deze aan de cache worden toegevoegd. Wanneer de afhankelijkheid van het item wordt gewijzigd, wordt het verwijderd uit de cache. De afhankelijkheid kan een bestand, een ander cache-item of een combinatie van de twee zijn. ASP.NET 2.0 biedt ook sql-cacheafhankelijkheden, waarmee ontwikkelaars een item aan de cache kunnen toevoegen en kunnen verwijderen wanneer de onderliggende databasegegevens worden gewijzigd. In de komende zelfstudie SQL Cache-afhankelijkheden zullen we SQL-cache afhankelijkheden onderzoeken.
Ongeacht de opgegeven verwijderingscriteria kan een item in de cache worden opgehaald voordat aan de criteria op basis van tijd of afhankelijkheid is voldaan. Als de cache de capaciteit heeft bereikt, moeten bestaande items worden verwijderd voordat nieuwe items kunnen worden toegevoegd. Als u dus programmatisch met gegevens in de cache werkt, is het essentieel dat u er altijd van uitgaat dat de gegevens in de cache mogelijk niet aanwezig zijn. We bekijken het patroon dat moet worden gebruikt bij het programmatisch openen van gegevens uit de cache in onze volgende zelfstudie, Gegevens opslaan in cache in de architectuur.
Caching biedt een voordelige manier om meer prestaties van een toepassing te persen. Zoals Steven Smith in zijn artikel ASP.NET Caching: Technieken en best practices uitlegt:
Caching kan een goede manier zijn om goede prestaties te krijgen zonder veel tijd en analyse te vereisen. Geheugen is goedkoop, dus als u de prestaties kunt krijgen die u nodig hebt door de uitvoer gedurende 30 seconden in de cache op te slaan in plaats van een dag of een week te besteden om uw code of database te optimaliseren, doet u de caching-oplossing (ervan uitgaande dat oude gegevens van 30 seconden ok zijn) en gaat u verder. Uiteindelijk zal slecht ontwerp waarschijnlijk bij u inhalen, dus natuurlijk moet u proberen uw toepassingen correct te ontwerpen. Als u goede prestaties nodig hebt, kan caching een uitstekende benadering zijn, waardoor u tijd krijgt om uw toepassing later te herstructureren wanneer u daar tijd voor heeft.
Hoewel caching aanzienlijke prestatieverbeteringen kan bieden, is deze niet van toepassing in alle situaties, zoals toepassingen die realtime gegevens gebruiken, regelmatig bijwerken of waar verouderde gegevens zelfs onacceptabel zijn. Maar voor het merendeel van de toepassingen moet caching worden gebruikt. Raadpleeg de sectie Caching for Performance van de zelfstudies ASP.NET 2.0 voor meer achtergrondinformatie over caching in ASP.NET 2.0.
Stap 1: webpagina's voor caching maken
Voordat we beginnen met het verkennen van de cachefuncties van ObjectDataSource, gaan we eerst de ASP.NET pagina's in ons websiteproject maken die we nodig hebben voor deze zelfstudie en de volgende drie. Begin met het toevoegen van een nieuwe map met de naam Caching. Voeg vervolgens de volgende ASP.NET pagina's toe aan die map en zorg ervoor dat u elke pagina koppelt aan de Site.master basispagina:
Default.aspxObjectDataSource.aspxFromTheArchitecture.aspxAtApplicationStartup.aspxSqlCacheDependencies.aspx
Afbeelding 1: De ASP.NET pagina's voor de zelfstudies voor Caching-Related toevoegen
Net als in de andere mappen, zal Default.aspx in de map Caching de zelfstudies in zijn sectie weergeven. Zoals u weet, biedt het SectionLevelTutorialListing.ascx gebruikersbeheer deze functionaliteit. Voeg daarom deze gebruikerscontrole toe aan Default.aspx door het vanuit de Solution Explorer naar de ontwerpweergave van de pagina te slepen.
Afbeelding 2: Afbeelding 2: Het gebruikersbesturingselement toevoegen SectionLevelTutorialListing.ascx aan Default.aspx (klik om de afbeelding op volledige grootte weer te geven)
Voeg tot slot deze pagina's toe als vermeldingen aan het Web.sitemap bestand. Voeg met name de volgende markeringen toe na het werken met binaire gegevens <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>
Neem na het bijwerken Web.sitemap even de moeite om de tutorialswebsite via een browser te bekijken. Het menu aan de linkerkant bevat nu items voor de caching-tutorials.
Afbeelding 3: De sitemap bevat nu vermeldingen voor de caching-tutorials
Stap 2: een lijst met producten weergeven op een webpagina
In deze zelfstudie wordt uitgelegd hoe u de ingebouwde cachefuncties van het ObjectDataSource-besturingselement kunt gebruiken. Voordat we deze functies kunnen bekijken, hebben we eerst een pagina nodig om van te werken. Laten we een webpagina maken die gebruikmaakt van een GridView om productgegevens weer te geven die zijn opgehaald door een ObjectDataSource uit de ProductsBLL klasse.
Open eerst de ObjectDataSource.aspx pagina in de Caching map. Sleep een GridView van de Werkset naar de Ontwerper, stel de eigenschap ID in op Products, en kies vanuit de smart tag om deze te binden aan een nieuw ObjectDataSource-besturingselement met de naam ProductsDataSource. Configureer de ObjectDataSource om met de ProductsBLL klasse te werken.
Afbeelding 4: De ObjectDataSource configureren om de ProductsBLL klasse te gebruiken (klik om de afbeelding op volledige grootte weer te geven)
Voor deze pagina gaan we een bewerkbare GridView maken, zodat we kunnen onderzoeken wat er gebeurt wanneer gegevens in de cache in de ObjectDataSource worden gewijzigd via de interface van GridView. Laat de vervolgkeuzelijst in het tabblad SELECT ingesteld op de standaardwaarde, GetProducts(), maar wijzig het geselecteerde item op het tabblad BIJWERKEN in de UpdateProduct overload die productName, unitPrice, en productID als invoerparameters accepteert.
Afbeelding 5: Stel de UPDATE-tabblad Drop-Down-lijst in op de juiste UpdateProduct overload (Klik om de volledige afbeelding weer te geven)
Stel ten slotte de vervolgkeuzelijsten in de tabbladen INVOEGEN en VERWIJDEREN in op (Geen) en klik op Voltooien. Wanneer u de wizard Gegevensbron configureren hebt voltooid, stelt Visual Studio de eigenschap ObjectDataSource in OldValuesParameterFormatString op original_{0}. Zoals besproken in de zelfstudie Een overzicht van het invoegen, bijwerken en verwijderen van gegevens , moet deze eigenschap worden verwijderd uit de declaratieve syntaxis of worden teruggezet op de standaardwaarde, {0}zodat onze updatewerkstroom zonder fouten kan doorgaan.
Bovendien voegt Visual Studio bij voltooiing van de wizard een veld toe aan GridView voor elk van de productgegevensvelden. Verwijder alle, behalve de ProductName, CategoryNameen UnitPrice BoundFields. Werk vervolgens de HeaderText eigenschappen van elk van deze BoundFields bij naar respectievelijk Product, Categorie en Prijs. Aangezien het ProductName veld is vereist, converteert u het BoundField naar een TemplateField en voegt u een RequiredFieldValidator toe aan de EditItemTemplate. Converteer op dezelfde manier het UnitPrice BoundField naar een TemplateField en voeg een CompareValidator toe om ervoor te zorgen dat de waarde die door de gebruiker is ingevoerd, een geldige valutawaarde is die groter is dan of gelijk is aan nul. Naast deze wijzigingen kunt u eventuele esthetische wijzigingen aanbrengen, zoals het rechts uitlijnen van de UnitPrice waarde, of het specificeren van de formattering voor de UnitPrice tekst in de interfaces voor Alleen-lezen en bewerken.
Maak de GridView bewerkbaar door het selectievakje 'Bewerken inschakelen' aan te vinken in de smarttag van de GridView. Vink ook de selectievakjes "Paging inschakelen" en "Sorteren inschakelen" aan.
Opmerking
Hebt u een overzicht nodig van het aanpassen van de bewerkingsinterface van GridView? Zo ja, raadpleegt u de zelfstudie Aanpassing van de Gegevenswijziging Interface.
Afbeelding 6: GridView-ondersteuning inschakelen voor bewerken, sorteren en paging (klik om de afbeelding op volledige grootte weer te geven)
Nadat u deze GridView-wijzigingen hebt aangebracht, moeten de declaratieve markeringen van GridView en ObjectDataSource er ongeveer als volgt uitzien:
<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>
Zoals in afbeelding 7 wordt weergegeven, geeft de bewerkbare GridView de naam, categorie en prijs weer van elk van de producten in de database. Neem even de tijd om de functionaliteit van de pagina te testen, de resultaten te sorteren, door deze te bladeren en een record te bewerken.
Afbeelding 7: Elke productnaam, -categorie en -prijs wordt vermeld in een sorteerbare, paginabare, bewerkbare rasterweergave (klik om de volledige afbeelding weer te geven)
Stap 3: Controleren wanneer de ObjectDataSource gegevens aanvraagt
GridView Products haalt de gegevens op die moeten worden weergegeven door de Select methode van de ProductsDataSource ObjectDataSource aan te roepen. Met deze ObjectDataSource creëert u een exemplaar van de klasse van de Bedrijfslogicalaag ProductsBLL en roept u zijn methode GetProducts() aan, die op zijn beurt de methode ProductsTableAdapter van de Data Access-laag GetProducts() aanroept. De DAL-methode maakt verbinding met de Northwind-database en geeft de geconfigureerde SELECT query uit. Deze gegevens worden vervolgens geretourneerd naar de DAL, die deze in een NorthwindDataTablepakket verpakt. Het DataTable-object wordt geretourneerd naar de BLL, die het retourneert naar de ObjectDataSource, die het naar de GridView retourneert. De GridView maakt vervolgens een GridViewRow object voor elk DataRow object in de DataTable en elk GridViewRow object wordt uiteindelijk weergegeven in de HTML die wordt geretourneerd naar de client en wordt weergegeven in de browser van de bezoeker.
Deze reeks gebeurtenissen vindt elke keer plaats wanneer GridView verbinding moet maken met de onderliggende gegevens. Dat gebeurt wanneer de pagina voor het eerst wordt bezocht, bij het verplaatsen van een pagina met gegevens naar een andere, bij het sorteren van de GridView of bij het wijzigen van de gegevens van de GridView via de ingebouwde bewerkings- of verwijderingsinterfaces. Als de weergavestatus van GridView is uitgeschakeld, wordt de GridView ook teruggezet op elke postback. GridView kan ook expliciet terugkeren naar de gegevens door de DataBind() methode aan te roepen.
Om de frequentie waarmee de gegevens worden opgehaald uit de database volledig te waarderen, laten we een bericht weergeven dat aangeeft wanneer de gegevens opnieuw worden opgehaald. Voeg een labelwebbesturingselement toe boven de GridView met de naam ODSEvents. Wis de Text eigenschap en stel de EnableViewState eigenschap in op False. Voeg onder het label een knopwebbesturingselement toe en stel de eigenschap in Text op Postback.
Afbeelding 8: Een label en knop toevoegen aan de pagina boven de rasterweergave (klik om de afbeelding op volledige grootte weer te geven)
Tijdens de werkstroom voor gegevenstoegang wordt de gebeurtenis ObjectDataSource Selecting geactiveerd voordat het onderliggende object wordt gemaakt en zijn geconfigureerde methode wordt aangeroepen. Maak een gebeurtenis-handler voor deze gebeurtenis en voeg de volgende code toe:
Protected Sub ProductsDataSource_Selecting(sender As Object, _
e As ObjectDataSourceSelectingEventArgs) _
Handles ProductsDataSource.Selecting
ODSEvents.Text = "-- Selecting event fired"
End Sub
Telkens wanneer de ObjectDataSource een verzoek om gegevens doet aan de architectuur, zal het label de tekst 'Selecteren evenement gestart' weergeven.
Ga naar deze pagina in een browser. Wanneer de pagina voor het eerst wordt bezocht, wordt de tekst Gebeurtenis selecteren weergegeven. Klik op de Postback-knop en merk op dat de tekst verdwijnt (ervan uitgaande dat de GridView EnableViewState-eigenschap is ingesteld op True, de standaardinstelling). Dit komt doordat de GridView bij terugdraaibewerking vanuit de weergavestatus wordt gereconstrueerd en daarom niet naar de ObjectDataSource wordt overgezet voor de bijbehorende gegevens. Het sorteren, pagineren of bewerken van de gegevens zorgt er echter voor dat GridView opnieuw wordt gekoppeld aan de gegevensbron en daarom wordt de geactiveerde tekst van de selectiegebeurtenis opnieuw weergegeven.
Afbeelding 9: Wanneer de GridView opnieuw is gekoppeld aan de gegevensbron, wordt het selecteren van een geactiveerde gebeurtenis weergegeven (klik hier om de volledige afbeelding weer te geven)
Afbeelding 10: Als u op de knop Terugklikken klikt, wordt de GridView gereconstrueerd vanuit de weergavestatus (klik om de afbeelding op volledige grootte weer te geven)
Het lijkt misschien verspilling om de databasegegevens op te halen telkens wanneer de gegevens worden gepaginad of gesorteerd. Omdat we standaard paging gebruiken, heeft ObjectDataSource alle records opgehaald bij het weergeven van de eerste pagina. Zelfs als gridView geen ondersteuning biedt voor sorteren en pagineren, moeten de gegevens worden opgehaald uit de database telkens wanneer de pagina voor het eerst wordt bezocht door een gebruiker (en op elke postback, als de weergavestatus is uitgeschakeld). Maar als de GridView dezelfde gegevens weergeeft voor alle gebruikers, zijn deze extra databaseaanvragen overbodig. Waarom worden de resultaten die zijn geretourneerd door de methode niet in de GetProducts() cache opgeslagen en bindt u de GridView niet aan die resultaten in de cache?
Stap 4: De gegevens opslaan in de cache met behulp van ObjectDataSource
Door eenvoudigweg een paar eigenschappen in te stellen, kan ObjectDataSource worden geconfigureerd om automatisch de opgehaalde gegevens in de ASP.NET-gegevenscache op te cachen. De volgende lijst bevat een overzicht van de cache-gerelateerde eigenschappen van de ObjectDataSource:
-
EnableCaching moet worden ingesteld op
Trueom caching in te schakelen. De standaardwaarde isFalse. -
CacheDuration de hoeveelheid tijd, in seconden, dat de gegevens in de cache worden opgeslagen. De standaardwaarde is 0. ObjectDataSource slaat alleen gegevens in de cache op als
EnableCachingTrueis enCacheDurationis ingesteld op een waarde groter dan nul. -
CacheExpirationPolicy kan worden ingesteld op
AbsoluteofSliding. AlsAbsolute, cachet de ObjectDataSource de opgehaalde gegevens gedurendeCacheDurationseconden. AlsSliding, verlopen de gegevens pas nadat zeCacheDurationseconden niet zijn geopend. De standaardwaarde isAbsolute. -
CacheKeyDependency gebruikt deze eigenschap om de cachevermeldingen van ObjectDataSource te koppelen aan een bestaande cacheafhankelijkheid. De gegevensvermeldingen van de ObjectDataSource kunnen voortijdig uit de cache worden verwijderd doordat de bijbehorende
CacheKeyDependencyverloopt. Deze eigenschap wordt meestal gebruikt om een SQL-cacheafhankelijkheid te koppelen aan de cache van ObjectDataSource, een onderwerp dat we in de toekomst verkennen met behulp van SQL Cache-afhankelijkheden .
We gaan de ObjectDataSource zo configureren dat de gegevens gedurende 30 seconden op een absolute schaal in de ProductsDataSource cache worden opgeslagen. Stel de eigenschap van EnableCaching van ObjectDataSource in op True en stel de eigenschap CacheDuration op 30. Laat de eigenschap ingesteld op de CacheExpirationPolicy standaardwaarde. Absolute
Afbeelding 11: De ObjectDataSource zo configureren dat de gegevens gedurende 30 seconden in de cache worden opgeslagen (klik hier om de volledige afbeelding weer te geven)
Sla uw wijzigingen op en ga opnieuw naar deze pagina in een browser. De tekst weergegeven na ontstaan van het Selecteren-evenement zal verschijnen wanneer u de pagina bezoekt voor de eerste keer, omdat de gegevens aanvankelijk niet in de cache staan. Maar latere postbacks die worden geactiveerd door te klikken op de knop Terug plaatsen, door te sorteren, pagineren, of te klikken op de knoppen Bewerken of Annuleren, geven de tekst van de geselecteerde gebeurtenis niet opnieuw weer. Dit komt doordat de Selecting gebeurtenis alleen wordt geactiveerd wanneer de ObjectDataSource de gegevens ophaalt uit het onderliggende object. De Selecting gebeurtenis wordt niet geactiveerd als de gegevens worden opgehaald uit de gegevenscache.
Na 30 seconden worden de gegevens uit de cache verwijderd. De gegevens worden ook uit de cache verwijderd als de ObjectDataSource s Insertof UpdateDelete methoden worden aangeroepen. Wanneer er 30 seconden zijn verstreken of de knop Bijwerken is ingedrukt, en er wordt gesorteerd, gepagineerd, of op de knoppen Bewerken of Annuleren geklikt, dan haalt de ObjectDataSource zijn gegevens op uit het onderliggende object. Daarbij wordt de tekst weergegeven die hoort bij de Selectie-gebeurtenis wanneer de Selecting gebeurtenis plaatsvindt. Deze geretourneerde resultaten worden teruggezet in de gegevenscache.
Opmerking
Als u de geselecteerde gebeurtenis regelmatig ziet geactiveerd, zelfs wanneer u verwacht dat de ObjectDataSource werkt met gegevens in de cache, kan dit worden veroorzaakt door geheugenbeperkingen. Als er onvoldoende vrij geheugen beschikbaar is, kunnen de gegevens die door de ObjectDataSource aan de cache zijn toegevoegd, mogelijk zijn opgeruimd. Als de ObjectDataSource de gegevens niet goed in de cache opslaat of deze slechts sporadisch in de cache worden opgeslagen, sluit dan enkele toepassingen om geheugen vrij te maken en probeer het opnieuw.
Afbeelding 12 illustreert de cachewerkstroom van ObjectDataSource. Wanneer de gebeurtenis Selecteren op het scherm verschijnt, komt dit doordat de gegevens zich niet in de cache bevonden en moesten worden opgehaald uit het onderliggende object. Wanneer deze tekst echter ontbreekt, komt dit doordat de gegevens beschikbaar waren in de cache. Wanneer de gegevens worden geretourneerd vanuit de cache, is er geen aanroep naar het onderliggende object en daarom wordt er geen databasequery uitgevoerd.
Afbeelding 12: ObjectDataSource slaat de gegevens op en haalt deze op uit de gegevenscache
Elke ASP.NET-toepassing heeft een eigen exemplaar van de gegevenscache dat wordt gedeeld voor alle pagina's en bezoekers. Dit betekent dat de gegevens die zijn opgeslagen in de gegevenscache door de ObjectDataSource, eveneens worden gedeeld door alle gebruikers die de pagina bezoeken. U kunt dit controleren door de ObjectDataSource.aspx pagina in een browser te openen. Wanneer u de pagina voor het eerst bezoekt, verschijnt de tekst 'Selecting event fired' (ervan uitgaande dat de gegevens die door eerdere tests aan de cache zijn toegevoegd inmiddels zijn verwijderd). Open een tweede browserexemplaar en kopieer en plak de URL van het eerste browserexemplaar naar de tweede. In het tweede browserexemplaar wordt de tekst die hoort bij de "Selecting"-gebeurtenis niet weergegeven, omdat dezelfde gegevens in de cache worden gebruikt als bij de eerste.
Bij het invoegen van de opgehaalde gegevens in de cache, gebruikt de ObjectDataSource een cachesleutelwaarde die het volgende bevat: de CacheDuration en CacheExpirationPolicy eigenschapswaarden; het type van het onderliggende bedrijfsobject dat door de ObjectDataSource wordt gebruikt, dat wordt gespecificeerd via de TypeName eigenschap (ProductsBLLin dit voorbeeld); de waarde van de SelectMethod eigenschap en de naam en waarden van de parameters in de SelectParameters verzameling; en de waarden van de StartRowIndex en MaximumRows eigenschappen, die worden gebruikt bij het implementeren van aangepaste paginering.
Het maken van de cachesleutelwaarde als een combinatie van deze eigenschappen zorgt voor een unieke cachevermelding wanneer deze waarden veranderen. In eerdere zelfstudies hebben we bijvoorbeeld gekeken naar het gebruik van de ProductsBLL klasse s GetProductsByCategoryID(categoryID), waarmee alle producten voor een opgegeven categorie worden geretourneerd. Een gebruiker kan naar de pagina komen en drankjes bekijken, die een CategoryID van 1 heeft. Als de ObjectDataSource de resultaten in de cache opsloeg zonder rekening te houden met de SelectParameters waarden, zou een andere gebruiker die naar de pagina kwam om specerijen te bekijken, de in de cache opgeslagen drankproducten zien in plaats van specerijen. Door de cachesleutel te variëren door deze eigenschappen, waaronder de waarden van de SelectParameters, onderhoudt de ObjectDataSource een afzonderlijke cachevermelding voor dranken en condiments.
Problemen met verouderde gegevens
ObjectDataSource verwijdert automatisch de items uit de cache wanneer een van zijn methoden, Insert, Update, of Delete, wordt aangeroepen. Dit helpt u te beschermen tegen verouderde gegevens door de cachevermeldingen te wissen wanneer de gegevens worden gewijzigd via de pagina. Het is echter mogelijk dat een ObjectDataSource met caching verouderde gegevens nog steeds weergeeft. In het eenvoudigste geval kan dit worden veroorzaakt doordat de gegevens rechtstreeks in de database worden gewijzigd. Misschien heeft een databasebeheerder zojuist een script uitgevoerd waarmee sommige records in de database worden gewijzigd.
Dit scenario kan ook op een subtielere manier worden uitgevouwen. Hoewel ObjectDataSource de items uit de cache verwijdert wanneer een van de methoden voor het wijzigen van gegevens wordt aangeroepen, worden de verwijderde items in de cache gebruikt voor de specifieke combinatie van eigenschapswaarden van ObjectDataSource (CacheDuration, TypeName, SelectMethodenzovoort). Als u twee ObjectDataSources hebt die verschillende SelectMethods of SelectParameters gebruiken, maar toch dezelfde gegevens kunnen bijwerken, kan één ObjectDataSource een rij bijwerken en de eigen cachevermeldingen ongeldig maken, maar de bijbehorende rij voor de tweede ObjectDataSource zal nog steeds uit de cache worden geleverd. Ik moedig u aan om pagina's te maken om deze functionaliteit te tonen. Maak een pagina met een bewerkbare GridView die de gegevens ophaalt uit een ObjectDataSource die gebruikmaakt van caching en is geconfigureerd om gegevens op te halen uit de ProductsBLL klassemethode GetProducts() . Voeg nog een bewerkbare GridView en ObjectDataSource toe aan deze pagina (of een andere), maar zorg ervoor dat voor deze tweede ObjectDataSource de GetProductsByCategoryID(categoryID) methode wordt gebruikt. Omdat de twee ObjectDataSources-eigenschappen SelectMethod verschillen, hebben ze elk hun eigen waarden in de cache. Als u een product in de ene tabel bewerkt, geeft de gegevensbinding bij het volgende koppelen aan de andere tabel (door paging, sorteren, enzovoort) nog steeds de oude, gecachede gegevens weer en niet de wijziging die vanuit de andere tabel is aangebracht.
Kortom, gebruik alleen op tijd gebaseerde expiries als u bereid bent om het potentieel van verouderde gegevens te hebben en kortere expiries te gebruiken voor scenario's waarin de versheid van gegevens belangrijk is. Als verouderde gegevens niet acceptabel zijn, kunt u afzien van caching of SQL-cacheafhankelijkheden gebruiken (ervan uitgaande dat het om de databasegegevens gaat die u in de cache opslaat). In een toekomstige zelfstudie verkennen we SQL-cacheafhankelijkheden.
Samenvatting
In deze zelfstudie hebben we de ingebouwde cachemogelijkheden van ObjectDataSource onderzocht. Door simpelweg een paar eigenschappen in te stellen, kunnen we de ObjectDataSource opdracht geven om de resultaten die worden geretourneerd door de opgegeven SelectMethod in de ASP.NET gegevenscache op te cachen. De CacheDuration en CacheExpirationPolicy eigenschappen geven de duur aan van het item in de cache en of het een absolute of schuifverlooptijd is. De CacheKeyDependency eigenschap koppelt alle cachevermeldingen van ObjectDataSource aan een bestaande cacheafhankelijkheid. Dit kan worden gebruikt om de ObjectDataSource-vermeldingen uit de cache te verwijderen voordat de verlooptijd op basis van tijd wordt bereikt en wordt meestal gebruikt met SQL-cacheafhankelijkheden.
Aangezien de ObjectDataSource zijn waarden eenvoudigweg in de cache opslaat, kunnen we de ingebouwde functionaliteit van de ObjectDataSource via code repliceren. Het is niet zinvol om dit te doen op de presentatielaag, omdat ObjectDataSource deze functionaliteit standaard biedt, maar we kunnen cachingmogelijkheden implementeren in een afzonderlijke laag van de architectuur. Hiervoor moeten we dezelfde logica herhalen die wordt gebruikt door de ObjectDataSource. We verkennen hoe u programmatisch kunt werken met de gegevenscache vanuit de architectuur in onze volgende zelfstudie.
Veel plezier met programmeren!
Meer lezen
Raadpleeg de volgende bronnen voor meer informatie over de onderwerpen die in deze zelfstudie worden besproken:
- ASP.NET caching: technieken en aanbevolen procedures
- Handleiding voor cachingarchitectuur voor .NET Framework-toepassingen
Over de auteur
Scott Mitchell, auteur van zeven ASP/ASP.NET-boeken en oprichter van 4GuysFromRolla.com, werkt sinds 1998 met Microsoft-webtechnologieën. Scott werkt als onafhankelijk consultant, trainer en schrijver. Zijn laatste boek is Sams Teach Yourself ASP.NET 2.0 in 24 uur. Hij kan worden bereikt op mitchell@4GuysFromRolla.com.
Speciale dank aan
Deze tutorialreeks is beoordeeld door veel behulpzame beoordelers. Eindrecensent voor deze handleiding was Teresa Murphy. Bent u geïnteresseerd in het bekijken van mijn aanstaande MSDN-artikelen? Zo ja, laat iets van je horen via mitchell@4GuysFromRolla.com.