J'utilise un cache de deuxième niveau et un cache de requêtes. Puis-je savoir comment effacer par programme tous les caches?
Pour vider le cache de session, utilisez session.clear()
Pour effacer le cache de 2e niveau, utilisez cet extrait de code
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).
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.
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.
}
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