Oracle
 sql >> Database >  >> RDS >> Oracle

Cancella la cache di 2° livello di Hibernate dopo l'aggiornamento manuale del DB

Secondo Hibernate JavaDoc, puoi usare org.hibernate.Cache.evictAllRegions() :

evictAllRegions() Elimina tutti i dati dalla cache.

Utilizzo di Session e SessionFactory:

Session session = sessionFactory.getCurrentSession();

if (session != null) {
    session.clear(); // internal cache clear
}

Cache cache = sessionFactory.getCache();

if (cache != null) {
    cache.evictAllRegions(); // Evict data from all query regions.
}

1) Se hai bisogno di aggiornare solo una entità (se direttamente da db aggiornerai solo alcune entità) non intera sessione, puoi usare

evictEntityRegion(Class entityClass) Elimina tutti i dati di entità dalla regione specificata (ad esempio

2) Se hai molte entità, che possono essere aggiornate direttamente da db, puoi usare questo metodo che rimuove tutte le entità dalla cache di 2° livello (possiamo esporre questo metodo agli amministratori tramite JMX o altri strumenti di amministrazione):

/**
 * Evicts all second level cache hibernate entites. This is generally only
 * needed when an external application modifies the game databaase.
 */
public void evict2ndLevelCache() {
    try {
        Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata();
        Cache cache = sessionFactory.getCache();
        for (String entityName : classesMetadata.keySet()) {
            logger.info("Evicting Entity from 2nd level cache: " + entityName);
            cache.evictEntityRegion(entityName);
        }
    } catch (Exception e) {
        logger.logp(Level.SEVERE, "SessionController", "evict2ndLevelCache", "Error evicting 2nd level hibernate cache entities: ", e);
    }
}

3) Un altro approccio è descritto qui per postgresql+hibernate, penso che tu possa fare qualcosa di simile per Oracle come questo