Co to są pamięci podręczne pierwszego i drugiego poziomu w trybie hibernacji?

245

Czy ktoś może wyjaśnić prostymi słowami, czym są buforowanie pierwszego i drugiego poziomu w trybie hibernacji?

sierść
źródło

Odpowiedzi:

300

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/

Dennis C
źródło
38
+1 za mapowanie pamięci podręcznej pierwszego poziomu z obiektem sesji i pamięci podręcznej drugiego poziomu z obiektem fabryki sesji. nawet nie musiałem czytać dalej.
Mahes,
1
Pamięć podręczna 1 poziomu. w większości przypadków nie jest to konieczne, ale nie ma opcji, aby się go pozbyć. ale powinieneś o tym cały czas myśleć.
ses
6
@ses W większości przypadków potrzebujesz pamięci podręcznej pierwszego poziomu. W przeciwnym razie będziesz mieć bardzo ZŁY BŁĄD WYDAJNOŚCI, taki jak zapytanie N + 1, lub brak chętnej pamięci podręcznej pobierania wstępnego lub zapytania za każdym razem, gdy uzyskasz dostęp do atrybutu.
Dennis C
Zwykle używamy sesji przez bardzo krótki czas [i bardzo poleca to ciało] / sesja krótkotrwała: nawet nie używamy tej pamięci podręcznej w tym okresie. jeśli sesja trwa długo, wówczas odłączamy dane (na przykład podczas edycji formularza) z sesji. Wydaje się, że jest to potrzebne tylko w jednym scenariuszu, gdy próbujemy użyć interfejsu API zapytania-sesji podczas budowania złożonego żądania po żądaniu dla długowiecznej sesji.
ses
1
@DennisCheung: Link nie działa. Uprzejmie zaktualizuj javabeat.net/introduction-to-hibernate-caching
NewUser
118

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.

lomaxx
źródło
20
to proste słowa, nie wiem, dlaczego tak trudno im to wytłumaczyć
BlackTigerX,
hehe ... tak, tak naprawdę nie wiem, jak mogłem być o wiele prostszy :)
lomaxx
2
to jest dla mnie bardziej zrozumiałe. pierwsza jest na sesję, a druga na sesję wieloskładnikową, o czym muszę pamiętać. nie głosujemy dwa razy? : D
czarny sensei
1
nie ma próbki, dlaczego potrzebna jest pamięć podręczna 1. poziomu. jak dla mnie w większości przypadków wcale nie jest to potrzebne. ale powinniście cały czas o tym myśleć i o sesji.
ses
Minęło 11 lat od tej odpowiedzi i niestety link już nie istnieje. Ale znalazłem jego zawartość na stronie archiwum: web.archive.org/web/20081207044228/http
Golu
105

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.

Creditto
źródło
2
Doskonałe wyjaśnienie! Jeśli możesz narysować kilka schematów sekwencji, będzie niesamowity !!!
Adelin
dokładne i miłe wyjaśnienie
ManishS
1
Jeśli chcesz zrewidować to, co już wiesz, to dwie powyższe odpowiedzi Dennisa C i Iomaxxa są świetne, bardzo zwięzłe i łatwe do zapamiętania. Jeśli jednak szukasz wyjaśnienia różnicy, gdy jeszcze tego nie wiesz, ta odpowiedź jest znacznie lepsza!
The Student Soul
Świetne wyjaśnienie !!
blu3
17

To bardzo częste pytanie, więc ta odpowiedź jest oparta na tym artykule, który napisałem na moim blogu.

Pamięć podręczna pierwszego poziomu

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.

wprowadź opis zdjęcia tutaj

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:

Pamięć podręczna drugiego poziomu

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 SessionFactoryjest 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ł .

Vlad Mihalcea
źródło
3

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.

Ravian
źródło
1

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ć.

Looser
źródło
-4

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.

Prakash Bayas
źródło