Post

Hibernate Cache de 2º Nível

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

  1. Cache de 1º Nível (L1): Obrigatório. Escopo de transação.
  2. Cache de 2º Nível (L2): Opcional. Escopo de SessionFactory (aplicação).
  3. 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:

  1. Adicionar o provedor no pom.xml.
  2. 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
    
  3. 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.

This post is licensed under CC BY 4.0 by the author.