Buforowanie danych za pomocą kontrolki ObjectDataSource (C#)

Autor: Scott Mitchell

Pobierz plik PDF

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 renderowana kontrolka użytkownika może być buforowana za pośrednictwem buforowania danych wyjściowych. 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

Dodawanie stron ASP.NET dla samouczków dotyczących Caching-Related

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. Dodawanie kontrolki użytkownika SectionLevelTutorialListing.ascx do Default.aspx

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

Mapa witryny zawiera teraz wpisy dla 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 .

Konfigurowanie obiektu ObjectDataSource do używania klasy 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 productNamewartości , unitPricei productID jako parametry wejściowe.

Ustaw listę Drop-Down kart AKTUALIZACJi na odpowiednie przeciążenie UpdateProduct

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 ProductNamepola , CategoryNamei 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 .

Włączanie obsługi funkcji GridView do edycji, sortowania i stronicowania

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.

Każda nazwa produktu, kategoria i cena są wymienione w poleceniu Sortable, Pageable, Editable GridView

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ę SelectProductsDataSource 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 ProductsTableAdapterGetProducts() 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 falsewartość . Poniżej kontrolki Etykieta dodaj kontrolkę Sieć Web przycisku i ustaw jej Text właściwość na Postback .

Dodawanie etykiety i przycisku do strony powyżej kontrolki GridView

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 void ProductsDataSource_Selecting(object sender, 
    ObjectDataSourceSelectingEventArgs e)
{
    ODSEvents.Text = "-- Selecting event fired";
}

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 truewartość , 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).

Za każdym razem, gdy obiekt GridView ma wartość Odbicia do źródła danych, zostanie wyświetlone wyzwolone zdarzenie

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)

Kliknięcie przycisku Ogłaszanie zwrotne powoduje odtworzenie widoku GridView ze stanu widoku

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 to false.
  • Buforowanie czasu buforowania (w sekundach) buforowania danych. Wartość domyślna to 0. Obiekt ObjectDataSource będzie buforować dane tylko wtedy, gdy EnableCaching wartość jest trueCacheDuration ustawiona na wartość większą niż zero.
  • Właściwość CacheExpirationPolicy można ustawić na Absolute wartość lub Sliding. Jeśli Absoluteobiekt ObjectDataSource buforuje pobrane dane przez CacheDuration kilka sekund. Jeśli Slidingdane wygasają dopiero po CacheDuration upływie kilku sekund. Wartość domyślna to Absolute.
  • 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.

Konfigurowanie obiektu ObjectDataSource w celu buforowania danych przez 30 sekund

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, Updatelub 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.

Obiekt ObjectDataSource przechowuje i pobiera dane z pamięci podręcznej 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 (ProductsBLLw 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 SelectParametersobiektu , 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, Updatelub 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, SelectMethoditd.). 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ą dopuszczalne, 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 możliwości buforowania w usłudze ObjectDataSource. Po prostu ustawiając kilka właściwości, możemy poinstruować obiekt ObjectDataSource, aby buforować wyniki zwrócone z określonego SelectMethod w 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 bezwzględne, czy przesuwane wygaśnięcie. Właściwość CacheKeyDependency kojarzy wszystkie wpisy pamięci podręcznej ObjectDataSource z istniejącą zależnością pamięci podręcznej 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 opartego na czasie 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 objectDataSource. Nie ma sensu, aby to zrobić w warstwie prezentacji, ponieważ obiekt ObjectDataSource oferuje tę funkcję poza polem, ale możemy zaimplementować możliwości buforowania w oddzielnej warstwie architektury. W tym celu należy powtórzyć tę samą logikę używaną przez obiekt ObjectDataSource. W następnym samouczku dowiesz 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:

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 sprawdzona przez wielu pomocnych recenzentów. Główny recenzent tego samouczka to Teresa Murphy. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi wiersz pod adresem mitchell@4GuysFromRolla.com.