2014-12-17 16 views
6

Używamy NHibernate 4 w naszej aplikacji asp.net mvc 4 (.net 4). O ile mogę powiedzieć, zachowanie NHibernate 4 zmieniło się nieco, jeśli chodzi o buforowanie drugiego poziomu.NHibernate 4: Wykorzystanie pamięci podręcznej drugiego poziomu dla zbiorów leniwych dla dzieci

następujące zachowanie wydaje się zmieniły (proszę mnie poprawić, jeśli się mylę):

  • Nie ma już transakcji potrzebne do korzystania z drugą pamięć podręczną poziomu
  • Kiedy wykonać kwerendy podobne (Hibsession .Query(). Gdzie (x => x.Nazwa == "x"). ToList()), następnie zapyta o jednostkę typu entreak. We wcześniejszych wersjach NHibernate - jeśli dobrze pamiętam - tylko identyfikatory jednostki zostałyby odzyskane.

Wydaje mi się, że drugi poziom ma zastosowanie jedynie w następujących przypadkach:

using (var hibSession = SessionFactory.OpenSession()) 
{ 
    // Second level cache working 
    var entity = hibSession.Get<ChachedEntity>(7); // second level cache working 
    var parent = entity.ParentElement; // second level cache working because n:1 

    // Probably working (not tested) 
    var elements = hibSession.Query<ChachedEntity>().Cacheable().Take(30).ToList(); // guessed behaviour: query-cache selects id's and then then uses second level cache 

    // second level cache NOT Working 
    var children = entity.ChildCollectionWithCachableEntities; // second level cache NOT working because 1:n (!!) 
} 

Moje pytania są teraz:

  • Gdzie jest zachowanie NHibernate 4 drugiego poziomu pamięci podręcznej z opisem (lub przynajmniej zmiany do udokumentowanej wersji 3)
  • Czy można używać pamięci podręcznej drugiego poziomu do leniwego ładowania elementów potomnych? (Lub przynajmniej zapewnić, że tylko ID są ładowane i wtedy drugi cache poziomu zmaterializować podmioty)

góry dzięki

Odpowiedz

0

Transakcje są nadal potrzebne. Jeśli ich nie użyjesz, pamięć podręczna zostanie wyłączona, gdy tylko zaczniesz aktualizować niektóre jednostki buforowane. (See here as for why, Niedawno zostałem ukąszony najnowszą wersją wersji NH Dlaczego nie przeoczyłem transakcji? Brak usprawiedliwienia ... Mając dodatkowo wyłączone read committed snapshot w SQL Server, który eliminuje zakleszczenia związane z pytaniami tylko do odczytu.)

Buforowanie kolekcji działa , ale musi być skonfigurowany w odwzorowaniu kolekcji. Dodaj węzeł <cache usage="..." /> do swoich zestawów i innych kolekcji wymagających buforowania. Zawarte w nich encje muszą być również buforowalne, aby było to rzeczywiście użyteczne. (Zbieranie pamięci podręcznej tylko buforuje klucze podstawowe podmiotów powiązanych.)

W mechanizmie zapytań ładowanie tylko identyfikatorów z DB, jeśli kwerenda jest buforowalna, nigdy nie byłem świadkiem tego, choć jestem długoletnim użytkownikiem NHibernate. (Używam jej od wersji 0.9, była już bardzo dojrzała i zawiera bogatą.) O ile mi wiadomo, nie było żadnych poważnych zmian w pamięci podręcznej drugiego poziomu z NH 4. Możesz sprawdzić ich issues and changes tracker.

Powiązane problemy