Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Limpe o cache de 2º nível do Hibernate após a atualização manual do banco de dados


De acordo com o Hibernate JavaDoc, você pode usar org.hibernate.Cache.evictAllRegions() :

evictAllRegions() Despeja todos os dados do cache.

Usando 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 você precisar atualizar apenas uma entidade (se diretamente do db, você atualizará apenas algumas entidades) e não toda a sessão, você pode usar

evictEntityRegion(Class entityClass) Despeja todos os dados de entidade de uma determinada região (ou seja,

2) Se você tiver muitas entidades, que podem ser atualizadas diretamente do db, você pode usar este método que remove todas as entidades do cache de 2º nível (podemos expor esse método aos administradores através do JMX ou outras ferramentas administrativas):
/**
 * 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) Outra abordagem é descrita aqui para postgresql+hibernate, acho que você pode fazer algo semelhante para Oracle assim