2009-02-24 7 views
5

Mam dość głęboki wykres obiektów (5-6 węzłów), a gdy przejdę przez to fragmenty, NHProf mówi mi, że mam problem "Wybierz N + 1" (który zrobić).Zapobieganie płynnemu NHibernate Wybierz n + 1

Dwa roztwory jestem świadomy są

  1. Chętni dzieci obciążenia
  2. rozpadają mój obiekt wykres (i chętny obciążenie)

ja naprawdę nie chcę zrobić albo (chociaż mogę później rozłożyć wykres, ponieważ widzę, że rośnie)

Na razie ....

Czy można powiedzieć NHibernate (z FluentNHibernate), że gdy próbuję uzyskać dostęp do dzieci, załadować je wszystkie za jednym zamachem, zamiast wybrać-n + 1-ing, jak I iteracyjne nad nimi?

Otrzymuję także "zestaw wyników bez ograniczeń", który prawdopodobnie jest tym samym problemem (lub raczej zostanie rozwiązany przez powyższe rozwiązanie, jeśli to możliwe).

Każda kolekcja dziecięca (na całym wykresie) będzie miała tylko około 20 członków, ale 20^5 to dużo, więc nie chcę mieć ochoty ładować wszystkiego, gdy dostanę root, ale po prostu wszystko. kolekcja dziecięca, ilekroć zbliżam się do niej.

Edytuj: po namyśle .... co jeśli chcę wprowadzić stronicowanie, gdy chcę renderować dzieci? Czy MUSZĘ złamać tutaj mój wykres obiektowy, czy jest jakiś podstęp, który mogę zastosować, aby rozwiązać wszystkie te problemy?

Odpowiedz

9

Wydaje mi się, że chcesz realizować podejście polegające na używaniu modelu domeny, zamiast tworzyć określone zapytanie nhibernate, aby obsłużyć ten scenariusz. Biorąc to pod uwagę, proponuję rzucić okiem na atrybut wielkości partii, który można zastosować do swoich kolekcji. Nowy interfejs Fluent NHibernate nie obsługuje jeszcze tego atrybutu, ale jako dzieło wokół można użyć:

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20") 

Biorąc pod uwagę ogólny brak informacji o planowanej scenariusza, nie mogę powiedzieć na pewno, czy partia rozmiaru jest Idealne rozwiązanie, ale na pewno polecam Ci spróbować. Jeśli jeszcze nie masz, proponuję czytać te:

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

NHibernate dokumentacja wydajność wyjaśni, jak działa partia-size.

Edycja: Nie jestem świadomy żadnego sposobu na stronę z Twojego modelu domeny. Polecam pisanie zapytań NH dla scenariuszy, w których wymagane jest stronicowanie.

+0

"Wydaje mi się, że chcesz kontynuować podejście polegające na używaniu modelu domeny, zamiast tworzyć specjalne zapytanie nhibernate do obsługi tego scenariusza." na pewno. ostatnia rzecz, której chcę, to konkretne zapytania. Sprawdzam te rzeczy, ta –

+3

note -> interfejs fluent-nh obsługuje teraz atrybut BatchSize() – KevinT

0

Edit: refleksja .... Co jeśli chcą wprowadzić stronicowania gdy chcę do renderowania dzieci? czy MAM złamać mój wykres obiektów tutaj, czy jest jakiś sneakyness mogę zatrudnić, aby rozwiązać wszystkie te problemy ?

Cóż, jeśli załadujesz tylko dzieci, możesz je zapisać na stronie :). Ale jeśli chcesz coś takiego: LoadParent AND PageChildren, to nie sądzę, że możesz to zrobić.

Powiązane problemy