Hibernate Cache de 2º Nível
Se o banco de dados é o gargalo da sua aplicação, você provavelmente já pensou em usar cache. O Hibernate oferece um mecanismo poderoso chamado Cache de Segundo Nível (L2 Cache). Mas cuidado: ele não é uma bala de prata e pode trazer complexidades inesperadas.
Além da Sessão
Diferente do Cache de 1º Nível (que vive apenas enquanto a Session está aberta), o Cache de 2º Nível é compartilhado por toda a aplicação (ou até entre múltiplos nós de um cluster). Isso significa que se um usuário buscar o Produto A, o segundo usuário que buscar o mesmo produto poderá recebê-lo direto da memória, sem tocar no banco.
Como funciona a Hierarquia
- Cache de 1º Nível (L1): Obrigatório. Escopo de transação.
- Cache de 2º Nível (L2): Opcional. Escopo de
SessionFactory(aplicação). - Cache de Query: Opcional. Armazena o resultado de consultas específicas (IDs resultantes).
Implementações Comuns
O Hibernate não implementa o cache sozinho; ele fornece as interfaces para você plugar provedores como:
- Ehcache: Muito comum para aplicações standalone.
- Infinispan: Excelente para ambientes distribuídos/clusterizados.
- Hazelcast: Outra opção robusta para sistemas distribuídos.
Exemplo de Configuração
Para habilitar, você precisa de três coisas:
- Adicionar o provedor no
pom.xml. - Habilitar nas propriedades do Hibernate:
1 2
hibernate.cache.use_second_level_cache=true hibernate.cache.region.factory_class=org.hibernate.cache.jcache.internal.JCacheRegionFactory
- Marcar suas entidades:
1 2 3 4
@Entity @Cacheable @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class Product { ... }
Estratégias de Concorrência
- READ_ONLY: Para dados que nunca mudam. Mais rápido.
- NONSTRICT_READ_WRITE: Se a consistência absoluta não for crítica.
- READ_WRITE: Garante consistência (usa locks). Ideal para a maioria dos casos.
- TRANSACTIONAL: Para transações JTA complexas.
Dados Obsoletos (Stale Data)
O maior desafio do L2 Cache é a invalidação. Se você atualizar um dado diretamente no banco (via SQL puro), o Hibernate não saberá e continuará servindo a versão antiga que está no cache. Portanto, use L2 Cache apenas quando a maior parte das alterações nos dados passar pelo próprio Hibernate.
Takeaway Prático: Quando Ativar o L2 Cache?
Antes de habilitar o Cache de 2º Nível, aplique a regra dos 80/20: identifique os 20% das tabelas que sofrem 80% das leituras e mudam raramente (como tabelas de configuração ou catálogos estáticos). Comece com a estratégia READ_ONLY para esses dados. Se precisar de READ_WRITE, garanta que toda alteração no banco passe pelo Hibernate; do contrário, você estará servindo fantasmas para seus usuários.