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
GO TO FULL VERSION