Buforowanie danych za pomocą kontrolki ObjectDataSource (VB)
Buforowanie może oznaczać różnicę między powolną i szybką aplikacją internetową. Ten samouczek jest pierwszym z czterech, który szczegółowo przyjrzyj się buforowaniu w ASP.NET. Poznaj kluczowe pojęcia dotyczące buforowania i sposób stosowania buforowania do warstwy prezentacji za pomocą kontrolki ObjectDataSource.
Wprowadzenie
W nauce komputerowej buforowanie jest procesem pobierania danych lub informacji, które są kosztowne do uzyskania i przechowywania kopii w lokalizacji, która jest szybciej dostępna. W przypadku aplikacji opartych na danych duże i złożone zapytania często zużywają większość czasu wykonywania aplikacji. Taka wydajność aplikacji może być często ulepszana przez przechowywanie wyników kosztownych zapytań bazy danych w pamięci aplikacji.
ASP.NET 2.0 oferuje różne opcje buforowania. Cała strona internetowa lub renderowane znaczniki kontrolki użytkownika można buforować za pomocą buforowania wyjściowego. Kontrolki ObjectDataSource i SqlDataSource zapewniają również możliwości buforowania, umożliwiając buforowanie danych na poziomie kontroli. Pamięć podręczna danych ASP.NET udostępnia rozbudowany interfejs API buforowania, który umożliwia deweloperom stron programowe buforowanie obiektów. W tym samouczku i kolejnych trzech omówimy użycie funkcji buforowania obiektu ObjectDataSource, a także pamięci podręcznej danych. Dowiemy się również, jak buforować dane dla całej aplikacji podczas uruchamiania i jak przechowywać dane w pamięci podręcznej w pamięci podręcznej za pomocą zależności pamięci podręcznej SQL. Te samouczki nie eksplorują buforowania danych wyjściowych. Aby uzyskać szczegółowe informacje na temat buforowania danych wyjściowych, zobacz Buforowanie wyjściowe w ASP.NET 2.0.
Buforowanie można stosować w dowolnym miejscu w architekturze z warstwy dostępu do danych w górę przez warstwę prezentacji. W tym samouczku przyjrzymy się zastosowaniu buforowania do warstwy prezentacji za pomocą kontrolki ObjectDataSource. W następnym samouczku przeanalizujemy dane buforowania w warstwie logiki biznesowej.
Kluczowe pojęcia dotyczące buforowania
Buforowanie może znacznie poprawić ogólną wydajność i skalowalność aplikacji przez pobranie danych, które są kosztowne do wygenerowania i przechowywania kopii w lokalizacji, do których można uzyskać bardziej wydajny dostęp. Ponieważ pamięć podręczna przechowuje tylko kopię rzeczywistych, bazowych danych, może stać się nieaktualna lub nieaktualna, jeśli bazowe dane się zmienią. Aby to zrobić, deweloper strony może wskazać kryteria, za pomocą których element pamięci podręcznej zostanie wykluczony z pamięci podręcznej przy użyciu jednego z następujących elementów:
- Kryteria oparte na czasie można dodać element do pamięci podręcznej przez bezwzględny lub przesuwany czas trwania. Na przykład deweloper strony może wskazywać czas trwania, na przykład 60 sekund. W przypadku bezwzględnego czasu trwania buforowany element jest eksmitowany 60 sekund po dodaniu go do pamięci podręcznej, niezależnie od tego, jak często był uzyskiwany dostęp. Po upływie czasu trwania przesuwania buforowany element jest eksmitowany 60 sekund po ostatnim dostępie.
- Kryteria oparte na zależnościach mogą być skojarzone z elementem po dodaniu do pamięci podręcznej. Gdy zależność elementu zmienia się, jest eksmitowana z pamięci podręcznej. Zależność może być plikiem, innym elementem pamięci podręcznej lub kombinacją tych dwóch elementów. ASP.NET 2.0 umożliwia również zależności pamięci podręcznej SQL, które umożliwiają deweloperom dodawanie elementu do pamięci podręcznej i eksmitowanie ich po zmianie danych bazowych bazy danych. Przeanalizujemy zależności pamięci podręcznej SQL w nadchodzącym samouczku Korzystanie z zależności pamięci podręcznej SQL.
Niezależnie od określonych kryteriów eksmisji element w pamięci podręcznej może zostać usunięty przed spełnieniem kryteriów opartych na czasie lub zależności. Jeśli pamięć podręczna osiągnęła pojemność, przed dodaniu nowych elementów należy usunąć istniejące elementy. W związku z tym podczas programowej pracy z buforowanymi danymi ważne jest, aby zawsze zakładać, że buforowane dane mogą nie być obecne. Przyjrzymy się wzorowi używanemu podczas uzyskiwania dostępu do danych z pamięci podręcznej programowo w następnym samouczku buforowanie danych w architekturze.
Buforowanie zapewnia ekonomiczne środki do ściskania większej wydajności z aplikacji. Jak Steven Smith artykuł przedstawia w swoim artykule ASP.NET buforowanie: techniki i najlepsze rozwiązania:
Buforowanie może być dobrym sposobem na uzyskanie wystarczającej wydajności bez konieczności dużej ilości czasu i analizy. Pamięć jest tańsza, więc jeśli możesz uzyskać wydajność, buforując dane wyjściowe przez 30 sekund zamiast spędzać dzień lub tydzień próbując zoptymalizować kod lub bazę danych, wykonaj rozwiązanie buforowania (przy założeniu, że 30-sekundowe stare dane jest ok) i przejdź dalej. W końcu słaba konstrukcja prawdopodobnie nadrobi zaległości, więc oczywiście należy spróbować poprawnie zaprojektować aplikacje. Ale jeśli po prostu musisz uzyskać wystarczająco dużo wydajności dzisiaj, buforowanie może być doskonałym [podejściem], kupując czas refaktoryzacji aplikacji w późniejszym terminie, kiedy masz czas, aby to zrobić.
Buforowanie może zapewnić zauważalne ulepszenia wydajności, ale nie ma zastosowania we wszystkich sytuacjach, takich jak w przypadku aplikacji korzystających z danych w czasie rzeczywistym, często aktualizowanych danych lub gdy nawet krótkotrwałe nieaktualne dane są niedopuszczalne. Jednak w przypadku większości aplikacji należy używać buforowania. Aby uzyskać więcej informacji na temat buforowania w ASP.NET 2.0, zapoznaj się z sekcją Buforowanie wydajności w samouczkach szybki start ASP.NET 2.0.
Krok 1. Tworzenie stron sieci Web buforowania
Zanim zaczniemy eksplorować funkcje buforowania objectDataSource, najpierw poświęćmy chwilę, aby utworzyć strony ASP.NET w naszym projekcie witryny internetowej, które będą potrzebne w tym samouczku i następne trzy. Zacznij od dodania nowego folderu o nazwie Caching
. Następnie dodaj do tego folderu następujące strony ASP.NET, aby skojarzyć każdą stronę ze stroną wzorcową Site.master
:
Default.aspx
ObjectDataSource.aspx
FromTheArchitecture.aspx
AtApplicationStartup.aspx
SqlCacheDependencies.aspx
Rysunek 1. Dodawanie stron ASP.NET dla samouczków Caching-Related
Podobnie jak w przypadku innych folderów Default.aspx
, w Caching
folderze zostaną wyświetlone samouczki w swojej sekcji. Pamiętaj, że kontrolka SectionLevelTutorialListing.ascx
użytkownika zapewnia tę funkcję. W związku z tym dodaj tę kontrolkę Default.aspx
użytkownika, przeciągając ją z Eksplorator rozwiązań do widoku projektu strony.
Rysunek 2. Rysunek 2. Dodawanie kontrolki SectionLevelTutorialListing.ascx
użytkownika do Default.aspx
(kliknij, aby wyświetlić obraz pełnowymiarowy)
Na koniec dodaj te strony jako wpisy do Web.sitemap
pliku. W szczególności dodaj następujące znaczniki po pracy z danymi <siteMapNode>
binarnymi :
<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 zaktualizowaniu Web.sitemap
programu poświęć chwilę, aby wyświetlić witrynę internetową samouczków za pośrednictwem przeglądarki. Menu po lewej stronie zawiera teraz elementy samouczków buforowania.
Rysunek 3. Mapa witryny zawiera teraz wpisy dla samouczków buforowania
Krok 2. Wyświetlanie listy produktów na stronie internetowej
W tym samouczku przedstawiono sposób używania wbudowanych funkcji buforowania kontrolki ObjectDataSource. Zanim jednak przyjrzymy się tym funkcjom, najpierw potrzebujemy strony do pracy. Utwórzmy stronę internetową, która używa elementu GridView do wyświetlania listy informacji o produkcie pobranych przez obiekt ObjectDataSource z ProductsBLL
klasy .
Zacznij od otwarcia ObjectDataSource.aspx
strony w folderze Caching
. Przeciągnij kontrolkę GridView z przybornika na Projektant, ustaw jej ID
właściwość na Products
, a następnie z tagu inteligentnego wybierz powiązanie go z nową kontrolką ObjectDataSource o nazwie ProductsDataSource
. Skonfiguruj obiekt ObjectDataSource do pracy z klasą ProductsBLL
.
Rysunek 4. Konfigurowanie obiektu ObjectDataSource do używania ProductsBLL
klasy (kliknij, aby wyświetlić obraz pełnowymiarowy)
Na tej stronie utwórzmy edytowalny element GridView, aby sprawdzić, co się stanie, gdy dane buforowane w obiekcie ObjectDataSource zostaną zmodyfikowane za pośrednictwem interfejsu GridView. Pozostaw listę rozwijaną na karcie SELECT ustawioną na wartość domyślną, GetProducts()
ale zmień wybrany element na karcie UPDATE na UpdateProduct
przeciążenie, które akceptuje productName
wartości , unitPrice
i productID
jako parametry wejściowe.
Rysunek 5. Ustaw listę Drop-Down kart AKTUALIZACJi na odpowiednie UpdateProduct
przeciążenie (kliknij, aby wyświetlić obraz pełnowymiarowy)
Na koniec ustaw listy rozwijane na kartach INSERT i DELETE na wartość (Brak), a następnie kliknij przycisk Zakończ. Po ukończeniu pracy Kreatora konfigurowania źródła danych program Visual Studio ustawia właściwość ObjectDataSource OldValuesParameterFormatString
na original_{0}
wartość . Zgodnie z opisem w samouczku Omówienie wstawiania, aktualizowania i usuwania danych ta właściwość musi zostać usunięta ze składni deklaratywnej lub ustawiona z powrotem na jej wartość domyślną, {0}
aby przepływ pracy aktualizacji mógł kontynuować bez błędu.
Ponadto po zakończeniu pracy kreatora program Visual Studio dodaje pole do kontrolki GridView dla każdego pola danych produktu. Usuń wszystkie, ale ProductName
pola , CategoryName
i UnitPrice
BoundFields. Następnie zaktualizuj HeaderText
właściwości każdego z tych pól powiązanych odpowiednio do wartości Product, Category i Price. Ponieważ pole jest wymagane, przekonwertuj ProductName
pole Powiązane na pole szablonu i dodaj element RequiredFieldValidator do elementu EditItemTemplate
. Podobnie przekonwertuj UnitPrice
pole BoundField na wartość TemplateField i dodaj element CompareValidator, aby upewnić się, że wartość wprowadzona przez użytkownika jest prawidłową wartością waluty, która jest większa lub równa zero. Oprócz tych modyfikacji możesz wykonywać wszelkie zmiany estetyczne, takie jak wyrównanie UnitPrice
wartości do prawej lub określenie formatowania tekstu w interfejsach tylko do UnitPrice
odczytu i edycji.
Ustaw element GridView jako edytowalny, zaznaczając pole wyboru Włącz edytowanie w tagu inteligentnym GridView. Zaznacz również pola wyboru Włącz stronicowanie i Włącz sortowanie.
Uwaga
Potrzebujesz przeglądu sposobu dostosowywania interfejsu edytowania kontrolki GridView? Jeśli tak, zapoznaj się z samouczkiem Dostosowywanie interfejsu modyfikacji danych .
Rysunek 6. Włączanie obsługi funkcji GridView do edycji, sortowania i stronicowania (kliknij, aby wyświetlić obraz pełnowymiarowy)
Po wprowadzeniu tych modyfikacji kontrolki GridView i ObjectDataSource znaczniki deklaratywne powinny wyglądać podobnie do następujących:
<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 pokazano na rysunku 7, edytowalny element GridView zawiera nazwę, kategorię i cenę każdego z produktów w bazie danych. Poświęć chwilę, aby przetestować funkcje strony posortować wyniki, stronicować je i edytować rekord.
Rysunek 7. Każda nazwa produktu, kategoria i cena znajdują się na liście w widoku Sortable, Pageable, Editable GridView (Kliknij, aby wyświetlić obraz pełnowymiarowy)
Krok 3. Badanie, kiedy obiekt ObjectDataSource żąda danych
Obiekt Products
GridView pobiera dane do wyświetlenia, wywołując metodę Select
ProductsDataSource
ObjectDataSource. To objectDataSource tworzy wystąpienie klasy warstwy ProductsBLL
logiki biznesowej i wywołuje jego GetProducts()
metodę, która z kolei wywołuje metodę s ProductsTableAdapter
GetProducts()
warstwy dostępu do danych. Metoda DAL łączy się z bazą danych Northwind i wystawia skonfigurowane SELECT
zapytanie. Te dane są następnie zwracane do dal, która pakuje je w obiekcie NorthwindDataTable
. Obiekt DataTable jest zwracany do biblioteki BLL, która zwraca go do obiektu ObjectDataSource, który zwraca go do obiektu GridView. Kontrolka GridView tworzy GridViewRow
następnie obiekt dla każdego DataRow
elementu w tabeli DataTable, a każdy z nich GridViewRow
jest ostatecznie renderowany w kodzie HTML, który jest zwracany do klienta i wyświetlany w przeglądarce odwiedzających.
Ta sekwencja zdarzeń jest wykonywana za każdym razem, gdy element GridView musi powiązać ze swoimi bazowymi danymi. Dzieje się tak, gdy strona jest odwiedzana po raz pierwszy, podczas przechodzenia z jednej strony danych do innej, podczas sortowania kontrolki GridView lub podczas modyfikowania danych kontrolki GridView za pomocą wbudowanej edycji lub usuwania interfejsów. Jeśli stan widoku GridView jest wyłączony, kontrolka GridView będzie również odbicia na każdym i każdym ogłaszaniu zwrotnym. Obiekt GridView można również jawnie odbić do swoich danych, wywołując jego DataBind()
metodę.
Aby w pełni docenić częstotliwość pobierania danych z bazy danych, wyświetlmy komunikat wskazujący, kiedy dane są ponownie pobierane. Dodaj kontrolkę Sieć Web Etykieta nad kontrolką GridView o nazwie ODSEvents
. Wyczyść jej Text
właściwość i ustaw jej EnableViewState
właściwość na False
wartość . Poniżej kontrolki Etykieta dodaj kontrolkę Sieć Web przycisku i ustaw jej Text
właściwość na Postback .
Rysunek 8. Dodawanie etykiety i przycisku do strony powyżej kontrolki GridView (kliknij, aby wyświetlić obraz pełnowymiarowy)
Podczas przepływu pracy dostępu do danych zdarzenie ObjectDataSource Selecting
jest wyzwalane przed utworzeniem obiektu bazowego i wywołaną jego skonfigurowaną metodę. Utwórz procedurę obsługi zdarzeń dla tego zdarzenia i dodaj następujący kod:
Protected Sub ProductsDataSource_Selecting(sender As Object, _
e As ObjectDataSourceSelectingEventArgs) _
Handles ProductsDataSource.Selecting
ODSEvents.Text = "-- Selecting event fired"
End Sub
Za każdym razem, gdy obiekt ObjectDataSource wysyła żądanie do architektury danych, etykieta wyświetli tekst Wybieranie zdarzenia wyzwolony .
Odwiedź tę stronę w przeglądarce. Gdy strona zostanie po raz pierwszy odwiedzona, zostanie wyświetlony tekst Wybieranie zdarzenia. Kliknij przycisk Ogłaszanie zwrotne i zwróć uwagę, że tekst zniknie (przy założeniu, że właściwość GridView EnableViewState
jest ustawiona na True
wartość , wartość domyślna). Wynika to z tego, że po wyświetleniu zwrotnym obiekt GridView jest odtwarzany ze stanu widoku i dlatego nie zwraca się do obiektu ObjectDataSource dla swoich danych. Jednak sortowanie, stronicowanie lub edytowanie danych powoduje ponowne powiązanie kontrolki GridView ze źródłem danych, a w związku z tym ponownie zostanie wyzwolony tekst Selecting event (Wybieranie).
Rysunek 9. Za każdym razem, gdy obiekt GridView ma wartość Odbicia do źródła danych, jest wyświetlane wybranie wyzwolojącego zdarzenia (kliknij, aby wyświetlić obraz o pełnym rozmiarze)
Rysunek 10. Kliknięcie przycisku Ogłaszanie zwrotne powoduje odtworzenie widoku GridView ze stanu widoku (kliknij, aby wyświetlić obraz o pełnym rozmiarze)
Pobieranie danych bazy danych za każdym razem, gdy dane są stronicowane lub posortowane, mogą wydawać się marnotrawne. Po tym wszystkim, ponieważ używamy domyślnego stronicowania, obiekt ObjectDataSource pobrał wszystkie rekordy podczas wyświetlania pierwszej strony. Nawet jeśli kontrolka GridView nie zapewnia obsługi sortowania i stronicowania, dane muszą być pobierane z bazy danych za każdym razem, gdy strona jest najpierw odwiedzana przez dowolnego użytkownika (i przy każdym ogłaszaniu zwrotnym, jeśli stan widoku jest wyłączony). Jeśli jednak obiekt GridView wyświetla te same dane wszystkim użytkownikom, te dodatkowe żądania bazy danych są zbędne. Dlaczego nie buforować wyników zwróconych z GetProducts()
metody i powiązać element GridView z tymi buforowanymi wynikami?
Krok 4. Buforowanie danych przy użyciu obiektu ObjectDataSource
Po prostu ustawiając kilka właściwości, można skonfigurować obiekt ObjectDataSource tak, aby automatycznie buforował pobrane dane w pamięci podręcznej danych ASP.NET. Poniższa lista zawiera podsumowanie właściwości związanych z pamięcią podręczną obiektu ObjectDataSource:
- Aby włączyć buforowanie, należy ustawić
True
opcję EnableCaching. Wartość domyślna toFalse
. - Buforowanie czasu buforowania (w sekundach) buforowania danych. Wartość domyślna to 0. Obiekt ObjectDataSource będzie buforować dane tylko wtedy, gdy
EnableCaching
wartość jestTrue
CacheDuration
ustawiona na wartość większą niż zero. - Właściwość CacheExpirationPolicy można ustawić na
Absolute
wartość lubSliding
. JeśliAbsolute
obiekt ObjectDataSource buforuje pobrane dane przezCacheDuration
kilka sekund. JeśliSliding
dane wygasają dopiero poCacheDuration
upływie kilku sekund. Wartość domyślna toAbsolute
. - CacheKeyDependency używa tej właściwości do skojarzenia wpisów pamięci podręcznej obiektuDataSource z istniejącą zależnością pamięci podręcznej. Wpisy danych obiektu ObjectDataSource mogą być przedwcześnie eksmitowane z pamięci podręcznej przez wygaśnięcie skojarzonego z nim elementu
CacheKeyDependency
. Ta właściwość jest najczęściej używana do kojarzenia zależności pamięci podręcznej SQL z pamięcią podręczną ObjectDataSource. W tym temacie omówimy w przyszłości samouczek Dotyczący używania zależności pamięci podręcznej SQL .
Skonfigurujmy obiekt ProductsDataSource
ObjectDataSource do buforowania danych przez 30 sekund w skali bezwzględnej. Ustaw właściwość ObjectDataSource EnableCaching
na True
i jej CacheDuration
właściwość na 30. Pozostaw właściwość ustawioną CacheExpirationPolicy
na wartość domyślną Absolute
.
Rysunek 11. Konfigurowanie obiektu ObjectDataSource w celu buforowania danych przez 30 sekund (kliknij, aby wyświetlić obraz o pełnym rozmiarze)
Zapisz zmiany i ponownie sprawdź tę stronę w przeglądarce. Po pierwszym otwarciu strony zostanie wyświetlony tekst Wybieranie zdarzenia, ponieważ początkowo dane nie są w pamięci podręcznej. Jednak kolejne ogłaszania zwrotne wyzwolone przez kliknięcie przycisku Ogłaszanie zwrotne, sortowanie, stronicowanie lub kliknięcie przycisków Edytuj lub Anuluj nie powoduje ponownej edycji tekstu wyzwolonego zdarzenia Selecting event . Jest to spowodowane tym, że Selecting
zdarzenie jest uruchamiane tylko wtedy, gdy obiekt ObjectDataSource pobiera dane z jego obiektu bazowego. Selecting
Zdarzenie nie jest uruchamiane, jeśli dane są pobierane z pamięci podręcznej danych.
Po 30 sekundach dane zostaną wykluczone z pamięci podręcznej. Dane zostaną również wykluczone z pamięci podręcznej, jeśli wywoływane są metody ObjectDataSource s Insert
, Update
lub Delete
. W związku z tym po upływie 30 sekund lub kliknięciu przycisku Aktualizuj, sortowaniu, stronicowaniu lub kliknięciu przycisków Edytuj lub Anuluj spowoduje, że źródło ObjectDataSource pobierze dane z jego obiektu bazowego, wyświetlając wyzwolony tekst zdarzenia Selecting po Selecting
uruchomieniu zdarzenia. Te zwrócone wyniki są umieszczane z powrotem w pamięci podręcznej danych.
Uwaga
Jeśli często jest wyświetlany tekst Selecting event fired (Wybieranie zdarzenia), nawet jeśli spodziewasz się, że źródło ObjectDataSource będzie działać z danymi w pamięci podręcznej, może to być spowodowane ograniczeniami pamięci. Jeśli za mało wolnej pamięci, dane dodane do pamięci podręcznej przez obiekt ObjectDataSource mogły zostać przeszyfrowane. Jeśli obiekt ObjectDataSource nie wydaje się poprawnie buforować danych lub buforuje tylko dane sporadycznie, zamknij niektóre aplikacje, aby zwolnić pamięć i spróbuj ponownie.
Rysunek 12 przedstawia przepływ pracy buforowania obiektuDataSource. Gdy na ekranie pojawi się wyzwolony tekst zdarzeń Selecting, jest to spowodowane tym, że dane nie znajdowały się w pamięci podręcznej i musiały zostać pobrane z obiektu bazowego. Gdy jednak brakuje tego tekstu, jest to spowodowane tym, że dane były dostępne z pamięci podręcznej. Gdy dane są zwracane z pamięci podręcznej, nie ma wywołania obiektu bazowego i dlatego nie jest wykonywane żadne zapytanie bazy danych.
Rysunek 12. Magazyny ObjectDataSource i pobierają dane z pamięci podręcznej danych
Każda aplikacja ASP.NET ma własne wystąpienie pamięci podręcznej danych współużytkowane przez wszystkie strony i odwiedzających. Oznacza to, że dane przechowywane w pamięci podręcznej danych przez obiekt ObjectDataSource są podobnie współużytkowane przez wszystkich użytkowników odwiedzających stronę. Aby to sprawdzić, otwórz ObjectDataSource.aspx
stronę w przeglądarce. Podczas pierwszej wizyty na stronie zostanie wyświetlony tekst Selecting event fired (przy założeniu, że dane dodane do pamięci podręcznej przez poprzednie testy do tej pory zostały wykluczone). Otwórz drugie wystąpienie przeglądarki i skopiuj i wklej adres URL z pierwszego wystąpienia przeglądarki do drugiego. W drugim wystąpieniu przeglądarki nie jest wyświetlany tekst wyzwalany przez zdarzenie Selecting, ponieważ używa on tych samych danych w pamięci podręcznej co pierwszy.
Podczas wstawiania pobranych danych do pamięci podręcznej obiekt ObjectDataSource używa wartości klucza pamięci podręcznej, która zawiera: CacheDuration
wartości właściwości i CacheExpirationPolicy
; typ bazowego obiektu biznesowego używanego przez obiekt ObjectDataSource, który jest określony za pośrednictwem TypeName
właściwości (ProductsBLL
w tym przykładzie); wartość SelectMethod
właściwości oraz nazwę i wartości parametrów w SelectParameters
kolekcji; oraz wartości jego StartRowIndex
właściwości i MaximumRows
, które są używane podczas implementowania niestandardowego stronicowania.
Utworzenie wartości klucza pamięci podręcznej jako kombinacji tych właściwości zapewnia unikatowy wpis pamięci podręcznej w miarę zmiany tych wartości. Na przykład w poprzednich samouczkach omówiliśmy użycie ProductsBLL
klasy s GetProductsByCategoryID(categoryID)
, która zwraca wszystkie produkty dla określonej kategorii. Jeden użytkownik może przyjść na stronę i wyświetlić napoje, które mają CategoryID
wartość 1. Jeśli obiekt ObjectDataSource buforował wyniki bez względu na SelectParameters
wartości, kiedy inny użytkownik przyszedł na stronę, aby wyświetlić przyprawy, podczas gdy produkty napojów znajdowały się w pamięci podręcznej, zobaczyliby buforowane produkty napojów, a nie przyprawy. Zmieniając klucz pamięci podręcznej według tych właściwości, które obejmują wartości SelectParameters
obiektu , obiekt ObjectDataSource utrzymuje oddzielny wpis pamięci podręcznej dla napojów i przypraw.
Nieaktualne obawy dotyczące danych
Obiekt ObjectDataSource automatycznie eksmituje swoje elementy z pamięci podręcznej po wywołaniu dowolnej z metod Insert
, Update
lub Delete
. Pomaga to chronić przed nieaktualnymi danymi przez wyczyszczenie wpisów pamięci podręcznej podczas modyfikowania danych za pośrednictwem strony. Jednak obiekt ObjectDataSource może nadal wyświetlać nieaktualne dane przy użyciu buforowania. W najprostszym przypadku może to być spowodowane zmianą danych bezpośrednio w bazie danych. Być może administrator bazy danych właśnie uruchomił skrypt, który modyfikuje niektóre rekordy w bazie danych.
Ten scenariusz może również rozwinąć się w bardziej subtelny sposób. Podczas gdy element ObjectDataSource eksmituje swoje elementy z pamięci podręcznej po wywołaniu jednej z metod modyfikacji danych, usunięte elementy buforowane są dla określonej kombinacji wartości właściwości ObjectDataSource (CacheDuration
, TypeName
, SelectMethod
itd.). Jeśli masz dwa obiekty ObjectDataSource, które używają różnych SelectMethods
elementów lub SelectParameters
, ale nadal można zaktualizować te same dane, jedna usługa ObjectDataSource może zaktualizować wiersz i unieważnić własne wpisy pamięci podręcznej, ale odpowiedni wiersz dla drugiego obiektu ObjectDataSource będzie nadal obsługiwany z pamięci podręcznej. Zachęcam do tworzenia stron, aby wykazywać tę funkcjonalność. Utwórz stronę wyświetlającą edytowalny obiekt GridView, który pobiera dane z obiektu ObjectDataSource, który używa buforowania i jest skonfigurowany do pobierania danych z ProductsBLL
metody klasy GetProducts()
. Dodaj kolejną edytowalną kontrolkę GridView i ObjectDataSource do tej strony (lub innej), ale dla tej drugiej właściwości ObjectDataSource użyj GetProductsByCategoryID(categoryID)
metody . Ponieważ dwie właściwości ObjectDataSources SelectMethod
różnią się, każda z nich będzie mieć własne wartości buforowane. Jeśli edytujesz produkt w jednej siatce, przy następnym powiązaniu danych z drugą siatką (przez stronicowanie, sortowanie i tak dalej), nadal będzie ona obsługiwać stare, buforowane dane i nie odzwierciedlać zmiany wprowadzonej w drugiej siatce.
Krótko mówiąc, używaj wygasań opartych na czasie tylko wtedy, gdy chcesz mieć potencjał nieaktualnych danych, i używaj krótszych wygasań w scenariuszach, w których świeżość danych jest ważna. Jeśli nieaktualne dane nie są akceptowalne, buforowanie lub używanie zależności pamięci podręcznej SQL (przy założeniu, że są to dane bazy danych, które są buforowane). W przyszłym samouczku zapoznamy się z zależnościami pamięci podręcznej SQL.
Podsumowanie
W tym samouczku przeanalizowaliśmy wbudowane funkcje buforowania objectDataSource. Po prostu ustawiając kilka właściwości, możemy poinstruować objectDataSource, aby buforować wyniki zwrócone z określonego SelectMethod
obiektu do pamięci podręcznej danych ASP.NET. Właściwości CacheDuration
i CacheExpirationPolicy
wskazują czas trwania buforowania elementu i określa, czy jest to wygaśnięcie bezwzględne, czy przesuwane. Właściwość CacheKeyDependency
kojarzy wszystkie wpisy pamięci podręcznej objectDataSource z istniejącą zależnością pamięci podręcznej. Może to służyć do eksmisji wpisów objectDataSource z pamięci podręcznej przed osiągnięciem wygaśnięcia na podstawie czasu i jest zwykle używany z zależnościami pamięci podręcznej SQL.
Ponieważ obiekt ObjectDataSource po prostu buforuje swoje wartości w pamięci podręcznej danych, możemy programowo replikować wbudowane funkcje obiektu ObjectDataSource. Nie ma sensu tego robić w warstwie prezentacji, ponieważ obiekt ObjectDataSource oferuje tę funkcję poza ramką, ale możemy zaimplementować funkcje buforowania w oddzielnej warstwie architektury. W tym celu należy powtórzyć tę samą logikę używaną przez obiekt ObjectDataSource. W następnym samouczku dowiemy się, jak programowo pracować z pamięcią podręczną danych z poziomu architektury.
Szczęśliwe programowanie!
Dalsze informacje
Aby uzyskać więcej informacji na temat tematów omówionych w tym samouczku, zapoznaj się z następującymi zasobami:
- ASP.NET buforowanie: techniki i najlepsze rozwiązania
- Przewodnik po architekturze buforowania dla aplikacji .NET Framework
Informacje o autorze
Scott Mitchell, autor siedmiu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 2.0 w ciągu 24 godzin. Można do niego dotrzeć pod adresem mitchell@4GuysFromRolla.com. Lub za pośrednictwem swojego bloga, który można znaleźć na stronie http://ScottOnWriting.NET.
Specjalne podziękowania
Ta seria samouczków została przejrzyona przez wielu przydatnych recenzentów. Głównym recenzentem tego samouczka była Teresa Murphy. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi wiersz pod adresemmitchell@4GuysFromRolla.com .