2008-12-22 14 views
81

Chciałbym buforować większość ciężkich operacji bazy danych w mojej witrynie asp.net-mvc. W swoich badaniach stwierdziliBuforowanie w asp.net-mvc

Ale nie wydaje mi się, żebym go jeszcze zdobył.
Chcę móc buforować moje żądanie POST w zależności od kilku elementów. Te pars znajdują się w obiekcie. Dlatego chciałbym buforować wynik następującego żądania:

public ActionResult AdvancedSearch(SearchBag searchBag) 

Gdzie searchBag jest obiektem, który przechowuje (kilka) opcjonalnych parametrów wyszukiwania. Moje widoki same w sobie są lekkie (tak, jak powinny), ale dostęp do danych może być dość czasochłonny, w zależności od tego, które pola są wypełnione w torbie wyszukiwania.

Mam wrażenie, że powinienem buforować dane na mojej karcie danych, a nie na moich działaniach.
Jak mam używać VaryByParam w atrybucie OutputCache?

+2

Czy próbowałeś z VaryByParam = "searchBag.property"? –

+0

nie, nie mam. Spróbuję, co mówisz. Ale co powiesz na wyliczenie kilku parametrów? –

+2

VaryByParam = "firstParam; secondParam; thirdParam" –

Odpowiedz

73

Ja też lubię buforować w warstwie modelu lub danych. To izoluje wszystko, co dotyczy pobierania danych z kontrolera/prezentacji. Dostęp do pamięci podręcznej ASP.NET można uzyskać z poziomu System.Web.HttpContext.Current.Cache lub skorzystać z modułu buforowania aplikacji z Biblioteki korporacyjnej. Utwórz klucz dla buforowanych danych z parametrów zapytania. Pamiętaj, aby unieważnić pamięć podręczną podczas aktualizowania danych.

+1

Powinienem przeczytać w Bibliotece Enterprise, jak myślę. Ponieważ większość opóźnień leży w warstwie danych, sądzę, że będzie to najlepsze rozwiązanie na końcu. Obecnie jest to tylko do odczytu DB, więc to usuwa problem nieaktualnego obiektu :) –

+17

Blok aplikacji do buforowania wygląda na cały bałagan przesady. Odkryłem, że w prawie każdym przypadku HttpRuntime.Cache jest więcej niż wystarczające. –

+3

Dlaczego przesadzać? Teraz jestem znacznie bardziej zaawansowany i zauważyłem, że system pamięci podręcznej EL jest naprawdę łatwy w użyciu. Odwołaj się do poprawnej biblioteki, dodaj prawidłowe wiersze konfiguracji i możesz rozpocząć buforowanie i pobieranie obiektów za pomocą jednego wiersza kodu. –

65

Albo możesz być niezależny od HttpContext.Current i dostępu Cache z HttpRuntime.Cache :)

+0

Co oznacza, że ​​nadal będzie można uzyskać dostęp do "pamięci podręcznej", gdy kod jest uruchamiany w wątku tła (tj. Asynchronizacja/oczekiwanie na dobroć). –

11

Często OutputCaching może być najbardziej szybkie i skuteczne, ale tylko wtedy, gdy spełnia określone wymagania. Nie ma sensu mieć szybkiej wydajności, jeśli jest źle! ;)

W tym przypadku brzmi to jak buforowanie w warstwie danych jest poprawne, ponieważ masz złożone potrzeby buforowania. Czasami można połączyć te dwa, jeśli zestaw parametrów kontrolujących, które dane wyjściowe są buforowane, jest prosty.

0

można użyć buforowania danych wyjściowych coś takiego

[OutputCache(Duration = 10, VaryByParam = "empID")] 
     public ActionResult GetEmployeeDetail(int empID) 
     { 
      Employee e = new Employee(); 
      return Content(e.getEmployeeDetails(empID)); 
     } 

lub można użyć profili cache ustawić go w sieci web config

<caching> 
<outputCacheSettings> 
    <outputCacheProfiles> 
     <add name="Admin" 

     duration="86420" varyByParam="none"/> 
    </outputCacheProfiles> 
</outputCacheSettings> 
</caching> 

and use this tag 
[OutputCache(CacheProfile="Admin")]