Hibernate cache de nível 2 não cache entidades empenhadas
-
05-07-2019 - |
Pergunta
Eu estou querendo saber se é possível para o Hibernate cache de segundo nível (estamos usando EHCache) para permitir que um aplicativo para armazenar em cache uma entidade que tem sido comprometidos com o DB se ele sabe que nenhum outro aplicativo está modificando o DB.
Meu pensamento é que se eu atualizar o registro A, então eu sei o valor de registro A e deve ser capaz de cache que, sistemas de agrupamento JVM como Terracotta apoiar este tipo de comportamento em termos de memória heap JVM usando fechaduras de sincronização Java.
Solução
O estado da arte POJO está em Ação livro fala sobre isso
Se uma aplicação de servidor único atualiza o banco de dados usando o framework de persistência, o quadro atualiza o cache de nível processo.
E ...
objetos em cache que são atualizável normalmente deve usar o bloqueio otimista, porque isso vai impedir que o aplicativo cegamente substituir alterações no banco de dados. E se uma transação atualiza um objeto em cache que já havia sido alterado no banco de dados, a falha bloqueio otimista fará com que a transação seja revertida. O framework de persistência irá remover os dados obsoletos do cache, ea aplicação pode repetir transação com a versão mais recente dos dados.
E escolher uma das seguintes estratégias de acordo com JPA com Hibernate livro
- Transactional: disponível em apenas um ambiente gerenciado, garante integral transacional isolamento até a leitura repetida, se necessário. Use esta estratégia para leitura na sua maioria de dados em que é fundamental para evitar que os dados obsoleto em transações simultâneas, No caso raro de uma atualização.
- leitura e escrita: Esta estratégia mantém leitura confirmada isolamento, usando um timestamping mecanismo e está disponível apenas em ambientes não clusterizados. Mais uma vez, usar essa estratégia para leitura na sua maioria de dados onde é fundamental para evitar que dados obsoletos em transações concorrentes, no caso raro de uma atualização.
Somado a anwser original: Hibernate não consistência de garantia entre o cache eo banco de dados se você usar @Cache (uso = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE). Se você quiser usá-lo, então você deve configurar um suficientemente curto de tempo limite de validade que pode afetar perfomance.
Atenciosamente,