JPA – L1 vs. L2 vs. Query Cache

Ostatnio bardzo dużo czasu musiałem poświecić na zrozumienie mechanizmów JPA, a w szczególności aktualnie najbardziej popularnej implementacji o nazwię Hibernate.
Dlatego postanowiłem napisać kilka postów związanych z tym tematem.
W pierwszym z nich zaprezentuje wam rodzaje pamięci podręcznych, które są wykorzystywane w Hibernate. Głownie skupie się na różnicy między L1 Cache i L2 Cache, ale wspomnę również o Query Cache.

Uważam, że najlepiej będzie, jeżeli w punktach wypisze, czym charakteryzują się pamięci, o których wspomniałem we wstępie.

L1 Cache

– związany z konkretnym obiektem Session
– domyślnie włączony i nie możemy go wyłączyć poprzez konfiguracje
– nie jest współdzielony między wątkami
– wykorzystana jest jego „Hibernatowa” implementacja
– spotkałem się ze stwierdzeniem że są tam przechowywane encje od początku transakcji aż do jej końca, ale to nie jest całkowita prawda. Należy to sprecyzować – przechowywane są w nim encje znane przez specyficzną sesje, a wiec, jeżeli mamy 3 transakcje w jednej sesji to wszystkie encje z nich będą w tym cache.
– encje z tej pamięci kasowane są, gdy zamkniemy sesje lub wywołamy którąś z metod czyszczących – evict() (usuwa jeden obiekt) lub clear() (kasuje wszystkie obiekty) ·- jeżeli w transakcji mamy naprawdę dużą ilość obiektów możemy trafić na wyjątek Out of Memory exception. Przed tym problemem możemy się zabezpieczyć poprzez użycie obiektu interfejsu StatelessSession(został on stworzony do wykonywania dużej ilości operacji na bazie danych. Nie implementuję on L1 cache oraz nie współpracuję z L2. Dodatkowo ma w sobie parę jeszcze innych ciekawych rzeczy, o których możecie przeczytać tutaj: Oficjalna dokumentacja

L2 Cache

– związany z konkretnym obiektem SessionFactory
– domyślnie wyłączony, ale możemy go włączyć poprzez odpowiednią konfigurację
– jest ponad obiektami Hibernate Sessions
– współdzielony przez wątki
– implementacja tego cache może być wybrana jakaś zewnętrzna jak np. EHCache lub JBossCache2 lub Infinispan (w jakimś z późniejszych artykułów przedstawię taka przykładową konfigurację)

Query Cache:

– w tej pamięci Hibernate zapisuje wyniki zapytań
– Hibernate nie „cache’uje” aktualnego stanu encji, przechowuje tylko dane identyfikacyjne wiec powinien być używany w połączeniu z L2 Cache

Dziękuję za przeczytanie tego artykułu.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *