Configurando o cache

Vamos voltar às nossas configurações de cache no arquivo 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"/>

Preste atenção na primeira linha - ela contém o nome da classe do mecanismo de cache. Na verdade, o Hibernate não implementa o cache internamente, em vez disso, ele fornece um conjunto de interfaces com as quais você pode implementar seu próprio mecanismo de cache.

Implementações populares incluem:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Ele pode ser armazenado em cache na memória ou no disco, bem como no cache do cluster, e também oferece suporte a um cache opcional dos resultados da consulta do Hibernate.

OSCache

Suporta cache de memória e disco na mesma JVM com um rico conjunto de políticas de expiração e suporte de cache de consulta.

SwarmCache

Cache de cluster baseado em JGroups. Ele usa invalidação em cluster, mas não oferece suporte ao cache de consulta do Hibernate.

JBoss CacheName

Um cache em cluster replicado totalmente transacional, também baseado na biblioteca multicast JGroups. Ele suporta replicação ou invalidação, comunicação síncrona ou assíncrona e bloqueio otimista e pessimista. Cache de consulta de hibernação é suportado.

Esses mecanismos não suportam todas as estratégias de acesso paralelo. A situação real é descrita na tabela abaixo:

Estratégia/Provedor Somente leitura leitura-gravação não estrita ler escrever transacional
EHCache x x x
OSCache x x x
SwarmCache x x
JBoss CacheName x x

Exemplo de configuração do EHCache

O mecanismo EHCache possui seu próprio arquivo de configuração chamado ehcache.xml. O conteúdo aproximado de tal arquivo:

<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"
/>

Aqui você pode definir as configurações de cache em geral e para cada entidade separadamente. Leia mais na documentação oficial .

Análise de estatísticas de cache

Você também pode precisar verificar o quão bem o mecanismo de cache está configurado. O Hibernate fornece um objeto especial de estatísticas especificamente para isso.

Exemplo:

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);

Não entraremos em detalhes sobre isso, porque ainda levará muitos anos até que você fique sem soluções de cache padrão e precise melhorá-las manualmente. A propósito, este comentário pode ter sido extraído de um caso semelhante:

// 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