Odpowiedzi:
1.1) Pamięć podręczna pierwszego poziomu
Pamięć podręczna pierwszego poziomu zawsze kojarzy się z obiektem sesji . Hibernacja domyślnie używa tej pamięci podręcznej. Tutaj przetwarza jedną transakcję po drugiej, co oznacza, że nie będzie przetwarzać jednej transakcji wiele razy. Głównie zmniejsza liczbę zapytań SQL, które musi wygenerować w ramach danej transakcji. Oznacza to, że zamiast aktualizować po każdej modyfikacji wykonanej w transakcji, aktualizuje transakcję dopiero pod koniec transakcji.
1.2) Pamięć podręczna drugiego poziomu
Pamięć podręczna drugiego poziomu zawsze wiąże się z obiektem Session Factory . Podczas uruchamiania transakcji pomiędzy nimi ładowane są obiekty na poziomie Session Factory, dzięki czemu obiekty te będą dostępne dla całej aplikacji, a nie dla pojedynczego użytkownika. Ponieważ obiekty są już ładowane do pamięci podręcznej, za każdym razem, gdy zapytanie jest zwracane przez zapytanie, w tym czasie nie ma potrzeby wykonywania transakcji bazy danych. W ten sposób działa pamięć podręczna drugiego poziomu. Tutaj możemy również użyć pamięci podręcznej poziomu zapytania.
Cytat z: http://javabeat.net/introduction-to-hibernate-caching/
Istnieje całkiem dobre wytłumaczenie buforowania pierwszego poziomu na blogu Streamline Logic .
Zasadniczo buforowanie pierwszego poziomu odbywa się dla każdej sesji, gdzie buforowanie drugiego poziomu może być współużytkowane przez wiele sesji.
Oto podstawowe wyjaśnienie hibernacji pamięci podręcznej ...
Pamięć podręczna pierwszego poziomu jest powiązana z obiektem „sesyjnym”. Zakres obiektów pamięci podręcznej obejmuje sesję. Po zamknięciu sesji buforowane obiekty znikają na zawsze. Pamięć podręczna pierwszego poziomu jest domyślnie włączona i nie można jej wyłączyć. Gdy po raz pierwszy pytamy o jednostkę, jest ona pobierana z bazy danych i przechowywana w pamięci podręcznej pierwszego poziomu powiązanej z sesją hibernacji. Jeśli ponownie zapytamy ten sam obiekt o ten sam obiekt sesji, zostanie on załadowany z pamięci podręcznej i żadne zapytanie SQL nie zostanie wykonane. Załadowany obiekt można usunąć z sesji przy użyciu evict()
metody. Kolejne ładowanie tego obiektu ponownie wywoła wywołanie bazy danych, jeśli zostało usunięte przy użyciu evict()
metody. Całą pamięć podręczną sesji można usunąć za pomocą clear()
metody. Spowoduje to usunięcie wszystkich jednostek przechowywanych w pamięci podręcznej.
Pamięć podręczna drugiego poziomu jest inna niż pamięć podręczna pierwszego poziomu, która jest dostępna do użytku globalnego w zakresie fabryki sesji. pamięć podręczna drugiego poziomu jest tworzona w zakresie fabryki sesji i jest dostępna do użycia we wszystkich sesjach utworzonych przy użyciu tej konkretnej fabryki sesji. Oznacza to również, że po zamknięciu fabryki sesji cała pamięć podręczna z nią związana umiera, a menedżer pamięci podręcznej również zamyka się. Ilekroć sesja hibernacji próbuje załadować encję, pierwsze miejsce szuka buforowanej kopii encji w pamięci podręcznej pierwszego poziomu (powiązanej z określoną sesją hibernacji). Jeśli buforowana jednostka jest obecna w pamięci podręcznej pierwszego poziomu, jest zwracana w wyniku metody ładowania. Jeśli w pamięci podręcznej pierwszego poziomu nie ma żadnej pamięci podręcznej, wówczas pamięć podręczna drugiego poziomu jest sprawdzana pod kątem pamięci podręcznej. Jeśli pamięć podręczna drugiego poziomu ma buforowaną jednostkę, jest ona zwracana w wyniku metody ładowania. Ale, przed zwróceniem encji jest ona również przechowywana w pamięci podręcznej pierwszego poziomu, dzięki czemu kolejne wywołanie metody ładowania dla encji zwróci jednostkę z samej pamięci podręcznej pierwszego poziomu i nie będzie potrzeby ponownego przechodzenia do pamięci podręcznej drugiego poziomu. Jeśli encja nie zostanie znaleziona w pamięci podręcznej pierwszego poziomu i pamięci podręcznej drugiego poziomu, wówczas zapytanie bazy danych jest wykonywane, a jednostka jest przechowywana na obu poziomach pamięci podręcznej, zanim zostanie zwrócona jako odpowiedźload()
metoda.
To bardzo częste pytanie, więc ta odpowiedź jest oparta na tym artykule, który napisałem na moim blogu.
Hibernacja próbuje odłożyć rumieniec Kontekstu Wytrwałości do ostatniej możliwej chwili. Jak wyjaśniłem w tym artykule , strategia ta była tradycyjnie znana jako transakcyjne zapisywanie.
Opóźnienie zapisu jest bardziej związane z opróżnianiem Hibernacji niż z jakąkolwiek logiczną lub fizyczną transakcją. Podczas transakcji kolor może wystąpić wiele razy.
Opróżnione zmiany są widoczne tylko dla bieżącej transakcji w bazie danych. Dopóki bieżąca transakcja nie zostanie zatwierdzona, żadne inne transakcje nie będą widoczne.
Ze względu na pamięć podręczną pierwszego poziomu Hibernacja może przeprowadzić kilka optymalizacji:
Właściwe rozwiązanie buforowania musiałoby obejmować wiele Sesji Hibernacji i dlatego Hibernacja obsługuje również dodatkową pamięć podręczną drugiego poziomu.
Pamięć podręczna drugiego poziomu jest powiązana z cyklem życia SessionFactory, więc jest niszczona tylko wtedy, gdy SessionFactory
jest zamknięta (zazwyczaj podczas zamykania aplikacji). Pamięć podręczna drugiego poziomu jest zorientowana przede wszystkim na jednostki, chociaż obsługuje również opcjonalne rozwiązanie buforowania zapytań.
Aby uzyskać więcej informacji, sprawdź ten artykuł .
domyślnie NHibernate używa buforowania pierwszego poziomu, który jest oparty na obiekcie sesji. ale jeśli pracujesz w środowisku z wieloma serwerami, pamięć podręczna pierwszego poziomu może nie być bardzo skalowalna, a niektóre problemy z wydajnością. dzieje się tak z powodu faktu, że musi on często podróżować do bazy danych, ponieważ dane są dystrybuowane na wielu serwerach. innymi słowy, NHibernate zapewnia podstawową, niezbyt zaawansowaną pamięć podręczną L1 w procesie po wyjęciu z pudełka. Nie zapewnia jednak funkcji, które rozwiązanie buforujące musi mieć znaczący wpływ na wydajność aplikacji.
więc wszystkie te problemy dotyczą użycia pamięci podręcznej L2 powiązanej z obiektami fabryki sesji. skraca czasochłonne podróże do bazy danych, co ostatecznie wydłuża czas odpowiedzi aplikacji.
Pamięć podręczna pierwszego poziomu
Obiekt sesji przechowuje dane pamięci podręcznej pierwszego poziomu. Jest domyślnie włączony. Dane pamięci podręcznej pierwszego poziomu nie będą dostępne dla całej aplikacji. Aplikacja może korzystać z wielu obiektów sesji.
Pamięć podręczna drugiego poziomu
Obiekt SessionFactory przechowuje dane pamięci podręcznej drugiego poziomu. Dane przechowywane w pamięci podręcznej drugiego poziomu będą dostępne dla całej aplikacji. Ale musimy to wyraźnie włączyć.
W pamięci podręcznej drugiego poziomu pliki hbm domeny mogą być kluczowalne i mieć wartość false. Na przykład w tej klasie domenowej część czasu trwania dnia pozostaje stała jako uniwersalna prawda. Można go więc oznaczyć jako niezmienny w różnych aplikacjach.