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.
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.
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.
[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.