Pergunta

P1:Estou certo de que apenas esses fornecedores oferecem suporte ao cache L2 do Hibernate no cluster?

  • Terracota para Hibernate (comercial)
  • SwarmCache (não lançado desde 2003)
  • Cache JBoss 1.x
  • Cache 2 do JBoss

Q2:Existem alternativas para o cache L2 do Hibernate?(Talvez algum cache de banco de dados?)

Foi útil?

Solução

Q1.EhCache funciona muito bem como o Hibernate L2 Cache, distribuído.Estamos usando isso para o nosso projeto.


Q2.Vários caches são possíveis.

  • Todos os bancos de dados já estão fazendo muito cache internamente, então não se preocupe com essa parte.

No entanto, o problema com o cache do banco de dados é que ele está fisicamente no servidor de banco de dados; portanto, cada consulta envolve uma chamada de rede (latência, banda com ..).Esse é o ponto principal dos caches no servidor de aplicativos.


  • O cache L2 do Hibernate tem algumas especificidades:
    • muito fácil de trabalhar (sem código, pouca configuração)
    • conceitualmente no nível da entidade (que é bastante refinado, às vezes precisamos armazenar em cache grãos maiores, para fazer menos solicitações de banco de dados),
    • trabalhando por id ou coleção (por exemplo, armazenar em cache o resultado de uma consulta está desativado por padrão, porque é impossível torná-lo útil no caso geral).

  • Quando o Hibernate L2 é inadequado, usamos a mesma biblioteca EhCache para armazenar dados em cache (que não são exatamente entidades).Exemplos de casos de uso:
    • quando uma mesa é grande (comprimento e número do registro), o uso da memória não permitiria armazená-lo completamente em cache, mas armazenar em cache apenas três campos para todos os registros é aceitável.Pode ser que esses campos sejam acessados ​​com frequência ou sejam imutáveis...
    • quando temos muitos acessos de leitura ao cache, e cada um acionaria um computação (no cache L2) dadas as entidades que temos:o resultado do cálculo pode ser armazenado no cache.(exemplo típico onde o cálculo requer detalhes de outras tabelas, mas os detalhes não são usados ​​no resultado final, portanto o cache não armazena esses detalhes)
    • quando entidades em uma tabela são agrupadas logicamente por categorias, e queremos solicitar e armazenar em cache uma categoria por vez, em vez da política regular de cache L2, que seria uma entidade por vez.

Em um contexto distribuído, isso geralmente se traduz em invalidar uma categoria em um momento em que uma de suas entidades é modificada, o que é funcionalmente lógico para nós (e essencial para o desempenho, de outra forma, teríamos que invalidar todas essas entidades;Isso ocorre porque o cache invalida uma região inteira, ou um objeto específico, mas entre você tem que fazer um loop, o que é ruim para o desempenho)

E outros, tenho certeza...

Portanto, este caso não está intimamente relacionado ao banco de dados, geralmente não armazena nossas entidades do Hibernate.Colocamos no Business Tier (e não no Data Access ou Daos), disponibilizamos diretamente para os códigos de negócios.Observe que para nós não se trata de um cache transparente, mas sim de uma chamada a um serviço de negócio explícito (responsável por esse cache:carregando-o se os dados não estiverem presentes, invalidando conforme necessário) que faz operações ou entrega valores.

Um problema divertido de Threading neste cache:como esse cache é acessado por nossos cem threads da web, ele precisa ser thread-safe.Você provavelmente sabe por que um valor thread-safe é imutável ou clonado em cada chamada (o que geralmente é um problema de desempenho).Portanto, todos os nossos caches comerciais usam objetos imutáveis ​​e o desempenho é excelente.

Outras dicas

Você também pode usar [Infinispan (Evolução do JBoss Cache) como provedor de cache do 2º nível!] [1

1]: ver http://infinispan.blogspot.com/2009/10/infinispan baseado em hibernate-cache.html

O Ehcache tem um modo distribuído, mas não tenho certeza se isso é suportado com o Hibernate. Não vejo por que não deveria funcionar.

Você omitiu o JBosscache 3 por algum motivo específico?

Hibernate-Redis Lib seria uma escolha perfeita. É um cache baseado em Redis.

Por que Redis? Está abrindo rápido, funciona em nuvem e tem solução de nuvem pronta como AWS Elasticache, então você não precisa administrá -lo sozinho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top