Invalidação de cache de Segundo Nível ao usar SQLQuery e executeUpdate()

Se você possui cache de segundo nível na sua aplicação como Infinispan ou Ehcache e no seu código você executa queries com executeUpdate() do Hibernate saiba que você pode estar invalidando todo seu cache de segundo nível.

Percebi esse comportamento em uma aplicação quando estava analisando problemas de performance e ao olhar os códigos fontes do Hibernate pude confirmar que isso realmente acontece.

Isso porque o Hibernate ao executar uma query nativa e possui cache de segundo nível ele entende que é muito arriscado fazer isso e manter o cache, pois pode gerar uma grande inconsistência de dados. Como ele não sabe qual região de cache está sendo afetada pela alteração/deleção ele prefere a invalidação total do que correr risco.

Para evitar esse problema basta você dizer ao Hibernate qual região de cache ele deve invalidar usando o método SQLQuery.addSynchronizedQuerySpace(String querySpace) sendo que o parâmetro passado é a região que será invalidada.

Caso a entidade que você está alterando não esteja em cache você pode simplesmente colocar uma string vazia como parâmetro e ele nada invalidará.

Deixe uma resposta