Wir haben eine Anwendung, die Hibernate's 2nd Level Caching verwendet, um Datenbanktreffer zu vermeiden.Hibernate 2nd level Cache Ungültigkeit, wenn ein anderer Prozess die Datenbank ändert
Ich frage mich, ob es einen einfachen Weg gibt, den Hibernate-2nd-Level-Cache der Java-Anwendung ungültig zu machen, wenn ein externer Prozess wie ein MySQL-Administrator direkt verbunden, um die Datenbank zu ändern (Update/Einfügen/Löschen).
Wir verwenden EHCache als unsere 2nd Level Cache-Implementierung.
Wir verwenden eine Mischung aus @Cache (usage = CacheConcurrencyStrategy.READ_WRITE) und @Cache (usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE), und wir haben kein Optimistic Concurrency Control aktiviert, das Timestamps für jede Entität verwendet.
Die Session enthält Methoden, um den zweiten Level-Cache zu verwalten: - 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
Aber weil wir individuelle Entitätsklassen mit @Cache mit Anmerkungen versehen, gibt es keinen zentralen Platz für uns „zuverlässig“ (zB kein Handbuch Schritte) fügen Sie das zur Liste hinzu.
// 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);
}
}
Es gibt keinen wirklichen Weg für 2nd Level Cache des Hibernate zu wissen, dass ein Unternehmen in der DB geändert, es sei denn, dass Entitätsabfragen (was der Cache Sie schützt). Also könnten wir als Lösung vielleicht eine Methode aufrufen, um den Second-Level-Cache zu zwingen, alles zu entfernen (wieder wegen mangelnder Sperr- und Nebenläufigkeitskontrolle riskieren Sie, dass Transaktionen vom "Lesen" oder Aktualisieren veralteter Daten ablaufen).
Ich möchte Cache-Daten aus 2nd-Level-Cache durch Aufruf von unten Methode löschen: - sessionFactory.getCache(). EvictEntityRegions(); Ich möchte nur wissen, gibt es einen Schaden dabei? Zum Beispiel: - Was passiert, wenn ich versuche, den Cache mitten in der Transaktion zu löschen? –