web-dev-qa-db-fra.com

Comment effacer tout le cache Hibernate (ehcache) à l'aide de Spring?

J'utilise un cache de deuxième niveau et un cache de requêtes. Puis-je savoir comment effacer par programme tous les caches?

23
cometta

Pour vider le cache de session, utilisez session.clear()

Pour effacer le cache de 2e niveau, utilisez cet extrait de code

18
Bozho

L'extrait de code indiqué dans la réponse Bozho est déconseillé dans Hibernate 4.

Selon Hibernate JavaDoc, vous pouvez utiliser org.hibernate.Cache.evictAllRegions():

Supprimer les données de toutes les régions de requête.

Utilisation de l'API:

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.
}

Vous pouvez également effacer toutes les données d'une étendue spécifique:

org.hibernate.Cache.evictCollectionRegions()
org.hibernate.Cache.evictDefaultQueryRegion()
org.hibernate.Cache.evictEntityRegions()
org.hibernate.Cache.evictQueryRegions()
org.hibernate.Cache.evictNaturalIdRegions()

Vous voudrez peut-être vérifier JavaDoc for hibernate Cache interface (Hibernate 4.3) .

Et aussi, expulsion du cache de second nivea du guide de développement hibernate (4.3).

32
Dino

Si vous branchez Terracotta, vous avez également la possibilité d'exécuter la Terracotta Dev Console qui peut inspecter les statistiques sur le cache, activer et désactiver le cache et effacer le contenu du cache de l'interface utilisateur.

Cette fonctionnalité est également disponible à partir des beans JMX.

3
Taylor Gautier

La réponse de @Dino a presque fonctionné pour moi mais j'ai reçu une erreur de sessionFactory.getCurrentSession() (Aucun currentSessionContext configuré!). J'ai trouvé que cela fonctionnait pour moi:

    // Use @Autowired EntityManager em
    em.getEntityManagerFactory().getCache().evictAll();

    // All of the following require org.hibernate imports
    Session session = em.unwrap(Session.class);

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

    SessionFactory sessionFactory = em.getEntityManagerFactory().unwrap(SessionFactory.class);

    Cache cache = sessionFactory.getCache();

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

Si vous voulez vider le cache de 2e niveau, utilisez api sessionFactory.evictEntity(entityName)

Code:

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

Pour plus de détails sur le cache de 2ème niveau voir

0
atish shimpi