Konfigurowanie buforowania
Wróćmy do naszych ustawień buforowania w pliku hibernate.cfg.xml:
<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletEhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
Zwróć uwagę na pierwszą linię - zawiera ona nazwę klasy silnika buforującego. Hibernate w rzeczywistości nie implementuje wewnętrznego buforowania, zamiast tego zapewnia zestaw interfejsów, za pomocą których można zaimplementować własny silnik buforujący.
Do popularnych implementacji należą:
- EHCache
- OSCache
- Pamięć podręczna roju
- JBoss TreeCache
EHCache
Może być buforowany w pamięci lub na dysku, a także w buforowaniu klastra, a także obsługuje opcjonalną pamięć podręczną wyników zapytań Hibernate.
OSCache
Obsługuje buforowanie pamięci i dysku w tej samej maszynie JVM z bogatym zestawem zasad wygasania i obsługą pamięci podręcznej zapytań.
Pamięć podręczna roju
Pamięć podręczna klastra oparta na JGroups. Używa klastrowego unieważniania, ale nie obsługuje pamięci podręcznej zapytań Hibernate.
Pamięć podręczna JBossa
W pełni transakcyjna replikowana klastrowana pamięć podręczna, również oparta na bibliotece multiemisji JGroups. Obsługuje replikację lub unieważnianie, komunikację synchroniczną lub asynchroniczną oraz blokowanie optymistyczne i pesymistyczne. Obsługiwana jest pamięć podręczna zapytań Hibernate.
Te silniki nie obsługują wszystkich strategii dostępu równoległego. Aktualna sytuacja została opisana w poniższej tabeli:
Strategia/Dostawca | Tylko czytać | nieścisły odczyt i zapis | odczyt-zapis | transakcyjny |
---|---|---|---|---|
EHCache | X | X | X | |
OSCache | X | X | X | |
Pamięć podręczna roju | X | X | ||
Pamięć podręczna JBossa | X | X |
Przykład konfiguracji EHCache
Silnik EHCache ma własny plik konfiguracyjny o nazwie ehcache.xml. Przybliżona zawartość takiego pliku:
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory = "1000"
eternal = "false"
timeToIdleSeconds = "120"
timeToLiveSeconds = "120"
overflowToDisk = "true"
/>
<cache name = "Employee"
maxElementsInMemory = "500"
eternal = "true"
timeToIdleSeconds = "0"
timeToLiveSeconds = "0"
overflowToDisk = "false"
/>
Tutaj możesz skonfigurować ustawienia buforowania zarówno ogólnie, jak i dla każdej jednostki osobno. Przeczytaj więcej w oficjalnej dokumentacji .
Analiza statystyk buforowania
Może być również konieczne sprawdzenie, jak dobrze skonfigurowany jest mechanizm buforowania. Hibernate udostępnia specjalny obiekt Statystyki specjalnie do tego celu.
Przykład:
Statistics statistics = session.getSessionFactory().getStatistics();
CacheRegionStatistics cacheStatistics = statistics.getDomainRegionStatistics(“com.codegym.employee”);
long hitCount = cacheStatistics.getHitCount();
long missCount = cacheStatistics.getMissCount();
double hitRatio = (double) hitCount / (hitCount + missCount);
Nie będziemy wchodzić w szczegóły na ten temat, ponieważ upłynie jeszcze wiele lat, zanim standardowe rozwiązania do buforowania wyczerpią się i będziesz musiał je ulepszać ręcznie. Nawiasem mówiąc, ten komentarz mógł pochodzić z podobnego przypadku:
// Dear programmer:
// When you're done "optimizing" this routine
// and realize how big of a mistake it was to do this,
// please increment the counter at the bottom as a warning
// for the next guy:
// number_of_hours_spent_here = 42
GO TO FULL VERSION