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