Problema com o cache do hibernate

A situação é a seguinte:

Tenho 1 sistema Web que conecta via hibernate num banco MySQL.
Tenho 1 sistema Android que conecta via hibernate no mesmo banco MySQL.

O problema é o seguinte:

Quando eu faço qualquer alteração na base por 1 sofwtare (Web ou Android) o outro não vê a alteração, pois o hibernate deve guardar o resultado em cache.

Já tentei o seguinte:

false
false
org.hibernate.cache.NoCacheProvider

E nada disso funcionou. Porém eu não quero desabilitar o cache totalmente, são apenas 3 tabelas das 20 que existem na base que são visualizadas/alteradas por ambos os softwares.

Se não tiver saída melhor, o jeito é desabilitar o cache por completo, porém nem isso eu estou conseguindo.

Obrigado a todos!

Bom dia!

Não sei se vai ajudar e talvez você já saiba disso.

Mas quando você quer que os dados que estão no cache sejam forçados a serem inseridos no banco é possível utilizar

getEntityManager().flush();

Assim o banco é atualizado de acordo com o cache.

Até mais…

Tem alguma coisa errada aí colega, pois se a aplicação é centralizada os 2 vêem as alterações e passam pelo mesmo cache. Recomendo vc dar uma olhada nisso!!

Mas se vc quer mesmo pular o cache em determinadas situações, você pode usar o org.hibernate.StatelessSession, ele não implementa o cache L1, e não interage com o cache L2.

Ou então, antes de fazer a consulta, vc pode dar um
session.clear(); ou getEntityManager().clear();
Que ele limpa seu cache também;

[quote=TJvargas]Tem alguma coisa errada aí colega, pois se a aplicação é centralizada os 2 vêem as alterações e passam pelo mesmo cache. Recomendo vc dar uma olhada nisso!!

Mas se vc quer mesmo pular o cache em determinadas situações, você pode usar o org.hibernate.StatelessSession, ele não implementa o cache L1, e não interage com o cache L2.

Ou então, antes de fazer a consulta, vc pode dar um
session.clear(); ou getEntityManager().clear();
Que ele limpa seu cache também;[/quote]

Bom dia TJVargas, a aplicação não é centralizada, cada software faz a sua conexão com o banco de dados.

Já tentei fazer session.clear(), que é a mesma coisa que o evict() porém para TODOS os objetos que estão na sessão.

Este getEntityManager().clear() eu ainda não tentei. Vou dar uma lida e depois tentar este também.

Obrigado!

[quote=Danilo Carvalho]Bom dia!

Não sei se vai ajudar e talvez você já saiba disso.

Mas quando você quer que os dados que estão no cache sejam forçados a serem inseridos no banco é possível utilizar

getEntityManager().flush();

Assim o banco é atualizado de acordo com o cache.

Até mais…[/quote]

Bom dia Danilo,

Os dados estão sendo inseridos normalmente, porém acontece o seguinte:

Imaginamos que ambos os softwares (Web e Android) estejam rodando e realizando consultas, a partir do momento que na aplicação Web eu realizar um Insert, este novo registro só é visualizado pela própria aplicação Web. Eu teria que dar um session.clear() talvez antes de realizar o select pelo aplicativo no Android, para forçar ele a ir no banco de dados e não pegar do cache, porém eu já fiz isso e não funcionou.

Obrigado!

[quote=aloha][quote=TJvargas]Tem alguma coisa errada aí colega, pois se a aplicação é centralizada os 2 vêem as alterações e passam pelo mesmo cache. Recomendo vc dar uma olhada nisso!!

Mas se vc quer mesmo pular o cache em determinadas situações, você pode usar o org.hibernate.StatelessSession, ele não implementa o cache L1, e não interage com o cache L2.

Ou então, antes de fazer a consulta, vc pode dar um
session.clear(); ou getEntityManager().clear();
Que ele limpa seu cache também;[/quote]

Bom dia TJVargas, a aplicação não é centralizada, cada software faz a sua conexão com o banco de dados.

Já tentei fazer session.clear(), que é a mesma coisa que o evict() porém para TODOS os objetos que estão na sessão.

Este getEntityManager().clear() eu ainda não tentei. Vou dar uma lida e depois tentar este também.

Obrigado![/quote]

o entityManager é equivalente JPA ao session do hibernate, portanto não adianta testar, e sim, ele limpa o cache de todos os objetos.

Estou confiante que isso vai funcionar, não vejo a hora de chegar em casa e testar.

Obrigado por enquanto TJvargas!