sql >> Base de Datos >  >> RDS >> Oracle

Borre el caché de segundo nivel de Hibernate después de la actualización manual de la base de datos

Según Hibernate JavaDoc, puede usar org.hibernate.Cache.evictAllRegions() :

evictAllRegions() Desalojar todos los datos del caché.

Usando Sesión y 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) Si necesita actualizar solo una entidad (si directamente desde la base de datos actualizará solo ciertas entidades) no toda la sesión, puede usar

evictEntityRegion(Class entityClass) Desaloja todos los datos de la entidad de la región dada (es decir,

2) Si tiene muchas entidades, que se pueden actualizar directamente desde la base de datos, puede usar este método que expulsa todas las entidades del caché de segundo nivel (podemos exponer este método a los administradores a través de JMX u otras herramientas de administración):

/**
 * 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) Aquí se describe otro enfoque para postgresql+hibernate, creo que puedes hacer algo similar para Oracle como este