Nous avons une application qui utilise la mise en mémoire cache de second niveau de Hibernate pour éviter les accès à la base de données. Je me demandais s'il existe un moyen simple d'invalider le cache Hibernate 2nd niveau de l'application Java lorsqu'un processus externe tel qu'un administrateur MySQL est directement connecté pour modifier la base de données (update/insert/delete).Hibernate invalidation de cache de second niveau lorsqu'un autre processus modifie la base de données
Nous utilisons EHCache comme implémentation de cache de second niveau. Nous utilisons un mélange de @Cache (utilisation = CacheConcurrencyStrategy.READ_WRITE) et @Cache (usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE), et nous n'avons pas de contrôle de concurrence optimiste activé en utilisant des horodatages sur chaque entité.
Le SessionFactory contient des méthodes pour gérer le 2ème niveau du cache: - Managing the Caches
sessionFactory.evict(Cat.class, catId); //evict a particular Cat
sessionFactory.evict(Cat.class); //evict all Cats
sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections
Mais parce que nous annoter classes d'entités individuelles avec @Cache, il n'y a pas de place centrale pour nous « fiable » (par exemple, pas de manuel étapes) ajouter cela à la liste.
// Easy to forget to update this to properly evict the class
public static final Class[] cachedEntityClasses = {Cat.class, Dog.class, Monkey.class}
public void clear2ndLevelCache() {
SessionFactory sessionFactory = ... //Retrieve SessionFactory
for (Class entityClass : cachedEntityClasses) {
sessionFactory.evict(entityClass);
}
}
Il n'y a pas de véritable moyen pour le cache de niveau 2 de mise en veille prolongée de savoir qu'une entité a changé dans la DB, à moins qu'il interroge cette entité (qui est ce que le cache vous protège de). Donc peut-être comme une solution nous pourrions simplement appeler une méthode pour forcer le cache de second niveau à tout expulser (encore une fois en raison du manque de verrouillage et de contrôle de concurrence, vous risqueriez de "lire" ou de mettre à jour les données périmées).
Je souhaite effacer les données de cache du cache de second niveau en appelant la méthode ci-dessous: - sessionFactory.getCache(). EvictEntityRegions(); Je veux juste savoir, y a-t-il un mal à faire cela? Par exemple: - Que se passe-t-il si j'essaie d'effacer le cache au milieu de la transaction? –