r14-t.doc

(455 KB) Pobierz
Szablon dla tlumaczy

Rozdział 14.
Wykorzystanie ulepszonych mechanizmów obsługi pamięci podręcznej ASP.NET

W poprzednich rozdziałach tej części książki przedstawione zostały różne metody dostępu do danych. Rozdziały 8., 9., 10. oraz 12. były poświęcone wykorzystaniu baz danych, rozdział 11. językowi XML, a 13. — wykorzystaniu plików. Także w tym rozdziale będziemy kontynuowali omawianie zagadnień związanych z dostępem do danych, a konkretnie — opiszę co można zrobić z informacjami gdy zostaną już pobrane.

Przechowywanie danych w pamięci podręcznej (ang. caching) jest techniką powszechnie wykorzystywaną w przetwarzaniu komputerowym, służącą do poprawy efektywności działania poprzez przechowywanie najczęściej wykorzystywanych informacji w pamięci. ASP.NET udostępnia wiele różnych mechanizmów służących do przechowywania danych w pamięci podręcznej. W tym rozdziale omówione zostaną następujące zagadnienia:

·         Czym jest przechowywanie danych w pamięci podręcznej oraz dlaczego się je stosuje.

·         W jaki sposób ASP.NET przechowuje dane w pamięci podręcznej bez wiedzy programisty.

·         W jaki sposób można przechowywać strony i obiekty w pamięci podręcznej.

·         W jaki sposób stosować zależności przy przechowywaniu danych w pamięci podręcznej.

·         Dostępne sposoby operowania pamięcią podręczną.

·         Jak należy efektywnie korzystać z pamięci podręcznej.

Czym jest przechowywanie informacji w pamięci podręcznej?

Przechowywanie danych w pamięci podręcznej jest stosowanym przez komputery sposobem szybkiego przypominania sobie informacji. Dane wykorzystywane bardzo często (a nawet nieco rzadziej), są zapisywane w miejscu, z którego komputer może je pobrać znacznie szybciej niż z oryginalnego miejsca ich przechowywania. Pamięć podręczna działa jak „kieszeń na informacje”, do której komputer ma łatwy i szybki dostęp. Korzyści jakie daje stosowanie pamięci podręcznej zostały przedstawione na rysunku 14.1.

 

Rysunek 14.1.              Pamięć podręczna to miejsce przechowywania informacji, do którego komputer ma łatwy dostęp.

Opis rysunku

1. … — 1. Pobranie informacji z oryginalnego miejsca ich przechowywania (witryny WWW)

2. … — 2. Zapisanie informacji w miejscu do którego można łatwo uzyskać dostęp (na przykład, na dysku twardym)

3. … — 3. Wykorzystanie informacji w aplikacji

Cache — Pamięć podręczna

Browser — Przeglądarka

 

Każdy kto kiedykolwiek używał przeglądarki WWW powinien znać już ideę przechowywania danych w pamięci podręcznej. W momencie wyświetlania strony, przeglądarka zapisuje ją bowiem (wraz ze wszelkimi, używanymi na niej rysunkami) w specjalnym miejscu na dysku twardym. Fakt ten, jest ważny dla użytkownika z dwóch powodów. Po pierwsze, przy kolejnej wizycie na tej samej stronie przeglądarka nie będzie już musiała pobierać jej (oraz użytych na niej obrazków) z witryny, lecz z lokalnego dysku. A po drugie, dzięki temu możliwe jest przeglądnięcie strony bez konieczności ponownego jej odwiedzania na Internecie. Przykład ten przedstawia dwa najważniejsze zagadnienia związane z przechowywaniem informacji w pamięci podręcznej — szybkość dostępu do informacji oraz możliwość dostępu do nich gdy w normalnych okolicznościach nie było by to możliwe.

Nowe określenie

Rozważania te skłaniają do zadania interesującego pytania: Co się dzieje gdy informacje przechowywane w pamięci podręcznej stają się zbyt stare? Co się stanie w przypadku gdy serwer WWW zastąpi stronę lub rysunek jego nowszą wersją? Ponieważ pamięć podręczna jest pierwszym miejscem w którym komputer będzie szukał informacji, oznacza to że pobrana zostanie stara wersja pliku. W takim przypadku zawartość pamięci podręcznej musi zostać zaktualizowana — okres jej przydatności upłynął.

Jak ASP.NET wykorzystuje pamięć podręczną

ASP.NET dysponuje wieloma, wbudowanymi mechanizmami obsługi pamięci podręcznej. Przechowywanie informacji w pamięci podręcznej jest bardzo ważne dla aplikacji internetowych, gdyż szybkość przesyłu danych przez Internet może być bardzo mała. Przechowując dane, ASP.NET daje aplikacjom pisanym w tej technologii, niezwykle potrzebną możliwość poprawienia efektywności działania. ASP.NET daje także programistom możliwość modyfikowania ustawień działania pamięci podręcznej.

Należy zwrócić uwagę, iż w ASP.NET dane zapisywane w pamięci podręcznej mogą być przechowywane w dwóch, ogólnie pojętych miejscach — po stronie klienta bądź na serwerze. Przechowywanie danych w pamięci podręcznej realizowane przez przeglądarkę WWW odbywa się po stronie klienta — w tym przypadku wszystkie informacje są przechowywane na komputerze użytkownika, a cały proces jest inicjowany i zarządzany przez przeglądarkę. Z drugiej strony, przechowywanie danych w pamięci podręcznej na serwerze jest obsługiwane przez serwer WWW i wykorzystuje jego zasoby; w tym przypadku przeglądarka nie ma żadnej kontroli nad zapamiętywanymi informacjami.

W tym rozdziale zajmiemy się właśnie przechowywaniem danych w pamięci podręcznej na serwerze. Przekonasz się, iż rozwiązanie to jest znacznie bardziej elastyczne i ma więcej zalet niż zapamiętywanie danych w przeglądarce. Różnice pomiędzy obiema metodami zostały przedstawione na rysunku 14.2.

 

Rysunek 14.2.              Różnice pomiędzy przechowywaniem informacji w pamięci podręcznej po stronie klienta oraz na serwerze

Opis rysunku

Client-side caching — Przechowywanie informacji w pamięci podręcznej po stronie klienta

Server — Serwer

Client — Klient

Step 1 Retrieve…— Etap 1. Pobranie danych z serwera

Step 2 Cache to hard…— Etap 2. Zapisanie danych na dysku twardym

Step 3 Retrieve… — Etap 3. Pobranie danych z dysku twardego przy obsłudze kolejnych żądań

Server-side caching — Przechowywanie informacji w pamięci podręcznej na serwerze

Server — Serwer

Client — Klient

ASP.NET Engine — Mechanizm ASP.NET

Step 1 … — Etap 1. Przesłanie danych przez ASP.NET

Step 2 … — Etap 2. Zapisanie danych w pamięci podręcznej

Step 3 … — Etap 3. Przesłanie danych z pamięci podręcznej przy obsłudze kolejnych żądań.

 

Czytając ten rozdział przekonasz się również, że możliwości przechowywania informacji w pamięci podręcznej nie ograniczają się wyłącznie do stron WWW i obrazów, lecz obejmują dane wielu różnych typów.

Przechowywanie stron w pamięci podręcznej

W momencie obsługi żądań kierowanych do stron ASP.NET, strony te są kompilowane. Jeśli kiedykolwiek tworzyłeś aplikacje w dowolnym języku programowania wymagającym kompilacji kodu źródłowego, to doskonale wiesz, iż proces kompilacji zajmuje nieco czasu i mocy obliczeniowej komputera. Gdyby strona ASP.NET musiała być kompilowana za każdym razem gdy zostanie odebrane skierowane do niej żądanie, to efektywność działania aplikacji ASP.NET byłaby niezwykle niska.

Na szczęście, gdy strony ASP.NET zostaną skompilowane, są one przechowywane w pamięci podręcznej na serwerze. To właśnie te skompilowane strony są wykorzystywane przy obsłudze nadsyłanych żądań. Użytkownik zaobserwuje zmniejszenie efektywności działania wynikające z konieczności kompilacji strony wyłącznie w  momencie obsługi pierwszego skierowanego do niej żądania; wszystkie kolejne żądania dotyczące tej samej strony będą obsługiwane znacznie szybciej.

Maszyna wirtualna CLR przegląda kod źródłowy stron ASP.NET w poszukiwaniu wszelkich zmian. Jeśli zawartość oryginalnego pliku .aspx zostanie zmodyfikowana, fakt ten zostanie odkryty, a ASP.NET unieważni kod przechowywany w pamięci podręcznej i zapisze w niej jego nową wersję.

A zatem, ASP.NET poprawia efektywność działania aplikacji przechowując w pamięci podręcznej skompilowane strony, dzięki czemu nie trzeba ich kompilować przy obsłudze wszystkich żądań.

Przechowywanie ustawień konfiguracyjnych

Jeśli czytając tę książkę tworzyłeś jednocześnie przykładowe aplikacje ASP.NET, mogłeś zauważyć jeszcze jeden czynnik spowalniający ich działanie. Otóż podczas pierwszego uruchamiania aplikacji — czyli podczas obsługi pierwszego żądania skierowanego do którejkolwiek ze stron przechowywanych w katalogu wirtualnym — ASP.NET musi pobrać wszystkie ustawienia konfiguracyjne podane w pliku web.config (więcej informacji na ten temat znajdziesz w rozdziale 18., pt.: „Konfiguracja i wdrażanie aplikacji ASP.NET”. W zależności od stopnia złożoności aplikacji, czynność ta może zająć nieco czasu.

Przyjrzyjmy się systemowemu plikowi web.config (zazwyczaj jest on zapisany w folderze C:\WinNT\Microsoft.NET\Framework\wersja\config.web). Jak widać plik ten może być całkiem złożony. Zazwyczaj pliki te mają ponad 450 wierszy długości! Wszystkie te ustawienia konfiguracyjne są zapamiętywane w pamięci podręcznej w chwili uruchamiania aplikacji, dzięki czemu ASP.NET może znacznie szybciej wykorzystywać informacje konfiguracyjne podczas obsługi stron wchodzących w skład aplikacji, niż w przypadku gdyby informacje te nie były zapamiętywane.

Zapisywanie w pamięci podręcznej wyników i danych

Zapamiętywanie w pamięci podręcznej wyników jest procesem polegającym na zapisaniu zawartości wygenerowanej przez dynamiczne strony ASP.NET; na przykład, może to dotyczyć obliczonych wartości a nawet elementów sterujących DataGrid. Zapamiętywanie wyników nie jest wykonywane automatycznie, lecz można je łatwo zrealizować. Informacje na ten temat znajdziesz w dalszej części rozdziału, w podrozdziale pt.: „Jak korzystać z pamięci podręcznej”.

Notatka
Nie należy mylić przechowywania danych w pamięci podręcznej z buforowaniem. Bufory są wykorzystywane do tymczasowego przechowywania wyników do momentu zakończenia przetwarzania. W odpowiednim momencie bufory są opróżniane. Pamięć podręczna wykorzystywana jest w celu przechowania informacji na dłuższy okres czasu, tak aby można ich było powtórnie użyć. Obie te metody mogą się mylić początkującym programistom.

Zapisywanie danych w pamięci podręcznej umożliwia zapamiętywanie informacji dowolnych typów, poczynając od rekordów baz danych, a kończąc na elementach sterujących tworzonych przez użytkowników. Rozwiązanie to przypomina nieco zapisywanie wyników w pamięci podręcznej, jednak jego możliwości nie ograniczają się wyłącznie do zapamiętywania samych wyników wygenerowanych przez stronę ASP.NET. Ta metoda wykorzystania pamięci podręcznej nie jest używana automatycznie, a zatem tylko od programisty zależy co zostanie zapamiętane.

Jak korzystać z pamięci podręcznej

ASP.NET umożliwia kontrolowanie sposobów przechowywania w pamięci podręcznej zarówno wyników jak i danych. Dzięki temu istnieje możliwość dostosowania sposobów działania pamięci podręcznej do potrzeb konkretnej aplikacji. Każda z tych metod udostępnia nieco inne mechanizmy wykorzystania pamięci podręcznej, a zatem niezwykle ważnym zagadnieniem jest poznanie ich wszystkich.

W trzech kolejnych podrozdziałach opisane zostaną trzy różne metody przechowywania danych w pamięci podręcznej udostępniane przez ASP.NET. Każda z nich ma swoje zalety i wady. Na szczęście jednak, ich wykorzystanie nie przysparza najmniejszych problemów. Zatem już wkrótce będziesz mógł w pełni korzystać z możliwości pamięci podręcznej!

Zapamiętywanie wyników wykonania stron ASP.NET

Włączenie zapisywania wyników wykonania stron ASP.NET w pamięci podręcznej jest bardzo proste — sprowadza się ono do wykorzystania dyrektywy OutoutCache:

<%@ OutputCache Duration="czasSkładowania" Location="miejsceSkładowania" %>

 

Umieszczenie tej dyrektywy w kodzie strony ASP.NET spowoduje, że wygenerowane przez nią wyniki zostaną zapisane w pamięci podręcznej, w miejscu określony przy użyciu parametru miejsceSkładowania i pozostaną tam przez okres czasu określony przy użyciu parametru czasSkładowania (i wyrażony w sekundach). Parametrowi Location można przypisać jedną z wartości przedstawionych w tabeli 14.1. (Należy pamiętać, iż jest to parametr opcjonalny).

 

Tabela 14.1.              Wartości parametru Location

Wartość

Opis

Any

Pamięć podręczna wyników może być umieszczona w każdym z dostępnych miejsc. To domyślna wartość tego parametru.

Client

Pamięć podręczna wyników będzie umieszczona na komputerze użytkownika.

Downstream

Pamięć podręczna będzie umieszczona na serwerze znajdującym się „poniżej” serwera który obsługuje żądania (czyli pomiędzy nim a komputerem użytkownika). Wartość ta jest stosowana w przypadku korzystania z serwerów pośredniczących.

None

Wyników tej strony nie należy przechowywać w pamięci podręcznej.

Server

Pamięć podręczna będzie umieszczona na serwerze obsługującym żądania.

 

Gdy przechowywanie wyników w pamięci podręcznej jest włączone, to wszystkie generowane informacje są zapisywane nie w pamięci, lecz na dysku twardym komputera określonego za pomocą parametru Location. Ma to ogromny wpływ na efektywność. Oznacza to również, że przechowywanie wyników daje niemal nieograniczone możliwości, gdyż nie wykorzystuje żadnych cennych zasobów.

Przeanalizujmy teraz konkretny przykład. Strona przedstawiona na listingu 14.1 wyświetla prostą wiadomość powitalną oraz aktualny czas.

 

Listing 14.1.              Wykorzystanie przechowywania wyników w pamięci podręcznej

1           <%@ Page Language="VB" %>

2           <%@ OutputCache Duration="30" VaryByParam="none" %>

3            

4           <script runat="server">

5             sub Page_Load(obj as object,e as eventargs)

6               lblMessage.Text ="Witaj! Teraz jest " & _

7                 DateTime.Now.ToString("T")

8             end sub

9            

10        </script>

11         

12        <html><body>

13        <font size="5 ">Wykorzystanie przechowywania

14        wyników w pamięci podręcznej</font><hr>

15        <asp:Label id="lblMessage" runat="server"/>

16        </body></html>

 

Analiza

Powyższy przykład przypomina zwyczajną stronę ASP.NET z dodatkową dyrektywą OutputCache. Dyrektywa ta powoduje, że wyniki wykonania strony zostaną zapisane w pamięci podręcznej i przechowane przez 30 sekund. Po upłynięciu tego okresu czasu zawartość pamięci podręcznej zostanie unieważniona, a kolejne żądanie spowoduje ponowne wykonanie strony i zapamiętanie wygenerowanych przez nią wyników. Wyniki wykonania powyższej strony zostały przedstawione na rysunku 14.3.

 

Rysunek 14.3.

UWAGA!! Numeracja w oryginale książki jest zła!! Rys. 14.2 jest już na str. 463.

              Wyniki zapamiętania w pamięci podręcznej informacji o aktualnym czasie

 

Zwróć uwagę na informacje o czasie wyświetlone na wynikowej stronie. Po kliknięciu przycisku Odśwież w przeglądarce, informacje te nie ulegną zmianie. Dziej się tak dlatego, iż strona jest pobierana z pamięci podręcznej na serwerze, a jej kod nie jest wykonywany. Wyniki przechowywane w pamięci podręcznej zostaną unieważnione po 30 sekundach, dlatego też, jeśli ponowne odwiedzenie strony po upłynięciu 30 sekund spowoduje wyświetlenie bieżącego czasu.

Mechanizmy przechowywania wyników w pamięci podręcznej są jednak znacznie potężniejsze niż można by przypuszczać na podstawie tego prostego przykładu. Na przykład, pamięć podręczna może porównać łańcuch zapytania dodany do adresu strony i na tej podstawie określić co należy zapamiętać. Zmodyfikujmy nieco naszą przykładową stronę, aby zademonstrować ten efekt.

 

Listing 14.2.              Zapamiętywanie łańcucha zapytania

1           <%@ Page Language="VB" %>

2           <%@ OutputCache Duration="30" VaryByParam="*" %>

3            

4           <script runat="server">

5             sub Page_Load(obj as object,e as eventargs)

6               lblMessage.Text ="Witaj! " & Request.Params("id") & _

7               "! Teraz jest " & DateTime.Now.ToString("T")

8             end sub

9            

10        </script>

11         

12        <html><body>

13        <font size="5 ">Wykorzystanie przechowywania

14        wyników w pamięci podręcznej</font><hr>

15        <asp:Label id="lblMessage" runat="server"/>

16        </body></html>

 

Analiza

W wierszu 6. listingu 14.2 została dodana metoda umożliwiająca pobranie wartości parametru id. W tym przykładzie został także wydłużony czas przechowywania wyników w pamięci podręcznej, dzięki czemu będziemy mieli więcej czasu na wypróbowanie działania przykładu, zanim zawartość pamięci zostanie unieważniona. Zapisz powyższy kod w pliku o nazwie listing1402.aspx i wyświetl ją w przeglądarce podając swoje imię w łańcuchu zapytania (na przykład: http://localhost//rozdzial13/listing1402.aspx?id=Chris). Teraz we wiadomości powitalnej powinno się pojawić podane imię. Należy także zwrócić uwagę na informacje o czasie — nawet po kliknięciu przycisku Odśwież nie ulegną one zmianie.

A teraz zmodyfikujmy nieco adres URL — listing1402.aspx?id=Zenek. W przeglądarce zostanie wyświetlona strona zawierająca nową wiadomość powitalną i bardziej aktualny czas. Odśwież tę stronę kilka razy, aby upewnić się, że jest ona przechowywana w pamięci podręcznej.

A teraz ponownie wpisz początkowy adres URL — ...

Zgłoś jeśli naruszono regulamin