Abbiamo un'applicazione che utilizza il caching di secondo livello di Hibernate per evitare gli hit del database.Sospensione dell'invalidazione della cache di secondo livello quando un altro processo modifica il database
Mi chiedevo se esiste un modo semplice per invalidare la cache di secondo livello di Hibernate dell'applicazione Java quando un processo esterno come un amministratore MySQL è connesso direttamente per modificare il database (aggiornamento/inserimento/eliminazione).
Stiamo utilizzando EHCache come implementazione della cache di secondo livello.
Abbiamo utilizzare una combinazione di @Cache (utilizzo = CacheConcurrencyStrategy.READ_WRITE) e @Cache (utilizzo = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE), e noi non hanno il controllo della concorrenza ottimistica attivata utilizzando timestamp su ogni entità.
Il SessionFactory contiene i metodi per gestire la cache di 2 ° livello: - 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
Ma perché viene annotata singole classi di entità con @Cache, non c'è posto centrale per noi (ad esempio, nessun manuale "affidabile" passi) aggiungilo alla lista.
// 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);
}
}
Non c'è nessun vero modo per la cache di 2 ° livello di Hibernate per sapere che un soggetto ha cambiato nel DB a meno che non interroga quell'entità (che è ciò che la cache è che si protegge da). Quindi, forse come soluzione, potremmo semplicemente chiamare un metodo per forzare la cache di secondo livello a sfrattare tutto (sempre a causa della mancanza di blocco e del controllo della concorrenza si rischiano transazioni in corso da "leggere" o aggiornare dati obsoleti).
Desidero cancellare i dati della cache dalla cache di secondo livello chiamando il metodo seguente: - sessionFactory.getCache(). EvictEntityRegions(); Voglio solo sapere, c'è qualche danno nel fare questo? Ad esempio: - Cosa succederà se provo a svuotare la cache nel mezzo della transazione? –