Kamil Kliczbor @ asptip.net

29Sep/130

Strategie pozyskiwania encji w NHibernate

NhLogoWhite64_med

Wprowadzenie

Istnieje wiele sposobów, na podstawie których NHibernate uzyskuje dostęp do powiązanych encji lub kolekcji encji. Prawidłowe zarządzanie strategiami wczytywania powiązanych obiektów umożliwia w wielu przypadkach poprawienie wydajności aplikacji. Deklaracja sposobu dostępu do encji może być podana w metadanych pliku mapowań (*.hbm.xml) lub nadpisana w zapytaniach HQL lub Criteria.

Dokumentacja przedstawia

Według opisu dokumentacji NHibernate w wersji 1.2, można ustawić wymienione niżej strategie mapowań. Należy zwrócić uwagę, że mapowania te definiują JAK wczytywane są kolekcje.

  • Join fetching - NHibernate pobiera dane z powiązaną encją lub kolekcją encji w tej samej klauzuli SELECT używając złączenia OUTER JOIN.
  • Select fetching - w celu uzyskania powiązanej encji lub kolekcji encji wykonywane jest dodatkowe zapytanie. Zapytanie to jest wykonywane w momencie próby uzyskania dostępu do powiązania, chyba że wyłączone jest późne wczytywanie (lazy fetching). Wyłączenie późnego wczytywania dokonuje się poprzez ustawienie atrybutu lazy="false" w mapowaniu.
  • Subselect fetching - wykonywane jest drugie zapytanie, które pobiera powiązane kolekcje dla wszystkich encji uzyskanych w poprzedzającym zapytaniu lub pobraniu danych wynikających z mapowania. Zachowanie dotyczące momentu wczytywania danych jest identyczne jak w powyższym przypadku.
  • "Extra-lazy" collection fetching - dostęp do poszczególnych elementów kolekcji uzyskiwany jest na "żądanie". NHibernate, dopóki nie jest to absolutnie koniecznie, próbuje  nie pobierać całej kolekcji danych do pamięci. Zachowanie takie jest rzeczywiście skuteczne w przypadku kolekcji o bardzo dużej ilości elementów.
  • Batch fetching - jest to optymalizacja stosowana w Select fetching - NHibernate pobiera zestaw encji lub kolekcji encji w  pojedynczym zapytaniu SELECT, poprzez zdefiniowanie listy kluczy głównych lub obcych w klauzuli WHERE.

NHibernate ze względu na to KIEDY podczytywane są powiązane encje, wymienia trzy strategie:

  • Immediate fetching - powiązana encja, kolekcja lub pole (określane jest to tutaj jako atrybut, ale nie jest to klasa z System.Attribute, lecz atrybuty klasy - właściwości, pola) pobierana jest natychmiast, gdy nadrzędna encja posiadająca relację zostaje załadowana.
  • Lazy collection fetching - kolekcja jest ściągana wówczas, gdy aplikacja wywołuje operacje na kolekcji (jest to domyślne zachowanie NHibernate dla kolekcji).
  • Proxy fetching - dla pojedynczych powiązań (druga strona relacji jeden do wielu) encja jest ściągana gdy aplikacja próbuje uzyskać dostęp do właściwości innej niż identyfikatora.

Widzimy, że w powyższych przykładach mamy do czynienia z dwoma odrębnymi strategiami pozyskiwania danych. W pierwszym przypadku definiujemy JAK dane są pobierane (jakie zapytanie w języku SQL zostanie wywołane), w drugim KIEDY powiązane encje zostaną podczytane.

 

Odniesienia

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

No trackbacks yet.