Potrzebujesz strategii zarządzania sesją, która pozwoli Twojej aplikacji działać efektywnie i korzystać z rzeczy, które oferuje NHibernate - w szczególności pamięci podręcznej i leniwego ładowania.
Tworzenie sesji jest procesem niedrogim i wymaga niewielkiej pamięci RAM lub procesora, więc nie powinieneś się martwić o konserwację lub ponowne używanie sesji (w rzeczywistości ponowne ich użycie może prowadzić do nieprzyjemnej i nieprzewidzianej strony -ruchomości). Fabryka sesji jest kosztowną rzeczą i powinna zostać zbudowana tylko raz podczas uruchamiania aplikacji.
Zasada jest taka: czas życia sesji musi być wystarczająco długi, aby nie utracić trwałych obiektów w zasięgu po zakończeniu sesji.
Po zakończeniu sesji wszystkie śledzenie zmian dla obiektów otrzymanych z tej sesji zatrzymuje się, więc zmiany te nie zostaną zapisane, chyba że celowo ponownie przyłączysz ten obiekt do nowej sesji. Sesja powinna zatem trwać tak długo, jak długo będą pobierane obiekty z niej pobierane. W aplikacji internetowej oznacza to zwykle sesję dla każdego żądania; w WinForms: sesja dla każdego formularza.
W twoim przypadku, z usługą (zakładam, że to działa jak usługa Windows) robi pracę NHibernate, można rozważyć posiadające sesji tworzony dla każdego nowego wniosku od spożywającej aplikacji komputerowej i usuwania go kiedy to żądanie zostało obsłużone. Nie wiesz dokładnie, jak działa twoja usługa i jaki mechanizm używa aplikacja komputerowa, aby z nią rozmawiać (remoting? WCF? Zwykły stary SOAP?) Nie mogę być bardziej konkretny.
(Istnieje kilka wyjątków od tej ogólnej zasady - załóżmy, że masz zestaw utrwalonych obiektów, które reprezentują wspólny zasób, do którego odnoszą się inne kody, ale nie zmieniają się, możesz załadować je z góry przy uruchamianiu aplikacji i opuścić Odłączono je od tego momentu.)
Jeśli wydajność jest powolna zgodnie z taką strategią, może to oznaczać, że po prostu rozmawiasz z bazą danych za dużo, a wykres obiektów jest złożony; spójrz na second-level caching w tym przypadku.
W pytaniu http://stackoverflow.com/questions/2011950/nhibernate-mappings-issue-when-referencing-class-lazy-load-issue poprosiłeś mnie, żebym zagłębił się w to nowe pytanie, ale widzę cię " Już otrzymałem duży zasięg. Wymieniam niektóre opinie tutaj, ale należy pamiętać, że sesje i transakcje są wymieszane w dyskusji, podczas gdy te są różne. Pula sesji lub sesja wyzwalana limitem czasu może być korzystna pod względem wydajności, ale trudna do skonfigurowania i poprawienia. Należy również pamiętać, że pod maską, łączenie połączeń jest używane niezależnie od wybranego wzorca. – Abel
Dzięki za komentarz Abel. W przykładach, które widziałem, sesje i transakcje często mają ten sam czas życia, ale jak widać w zadawanym pytaniu, może to być czasem problem. Mam nadzieję, że ludzie odpowiedzieli na "okres życia sesji" - nie "czas trwania transakcji", jestem pod wrażenie, że tak jest. – stiank81