2012-10-23 12 views
30

Używam dapper do zwracania obiektów z mojej bazy danych jako IEnumerable. Jako domyślny dapper ustawił bufor na wartość true.Objaśnienie domyślnego bufora/pamięci podręcznej

Jak to działa?

Jeśli dapper buforuje pierwsze zapytanie, a następnie pobiera obiekty z pamięci.

Co się stanie, gdy ktoś edytuje/usunie/doda wiersze w tabeli. Czy po ponownym przesłaniu tego zapytania należy ponownie zebrać wszystkie dane?

Odpowiedz

44

Bufor nie jest powiązany z pamięcią podręczną. Dapper nie zawiera żadnego rodzaju pamięci podręcznej danych (chociaż ma pamięć podręczną związaną z procesem przetwarzania poleceń, tj. "Ten łańcuch polecenia, z tym typem parametru, i tym typem encji - ma powiązane z nimi dynamicznie generowane metody do konfiguracji polecenie i zapełnij obiekty ").

Co to przełącznik naprawdę oznacza to:

  • false: będzie iteracyjne elementów, ponieważ są one otrzymał/zużyte - w zasadzie, iterator blok wokół IDataReader
    • minus: można tylko iteracyjne raz (chyba, że ​​z przyjemnością powtórzysz zapytanie):
    • plus: możesz powtórzyć zapytania (), bez potrzeby ich jednoczesnego zapamiętywania - ponieważ jesteś naprawdę bardzo zainteresowany. przy kur Wygeneruj wiersz rzędu
    • dodatkowo: nie musisz czekać na koniec danych, aby rozpocząć iterację - gdy tylko ma co najmniej jeden wiersz, dobrze jest przejść
    • minus: połączenie jest w użyciu podczas iteracji, co może prowadzić do tego, że "istnieje już otwarty czytnik połączenia" (lub cokolwiek to jest dokładne), jeśli spróbujesz wywołać inne polecenia z podziałem na wiersze (może to być łagodzony przez MARS)
    • minus: ponieważ konsument może zrobić, co chcą za pozycję (może to potrwać kilka minut w każdym wierszu, jeśli robią coś kompleks), komenda/czytelnik może być otwarty dłużej
  • true (domyślnie): dane są całkowicie zużywane w List<T> przed wręcza je z powrotem do Ciebie
    • Plus: można iterację go jako tyle razy, ile chcesz
    • minus: jeśli zapytanie jest ogromna, załadunek wszystko do pamięci (na liście) może być kosztowne/niemożliwe
    • minus: jeśli zapytanie jest duże, może wystąpić zauważalny opóźnienie podczas zbierania ostatniego wiersza
    • dodatkowo: po uzyskaniu danych polecenie jest kompletny - więc nie ma konfliktu między tą i kolejnymi operacjami
    • plus: jak tylko otrzymasz dane, komenda wydała już żadnych zasobów (zamki itp), więc masz minimalny wpływ na serwerze

Większość zapytań zwrócić tylko umiarkowaną ilość danych (powiedzmy, mniej niż 100 rekordów), więc cieszymy się, że ustawienie domyślne (true) zapewnia najbardziej odpowiednie zachowanie dla większości scenariuszy. Ale udostępniamy tę opcję, aby uwzględnić różne scenariusze użycia.

Powiązane problemy