如何使用Spring清除所有Hibernate缓存(ehcache)?

我正在使用二级缓存和查询缓存。 我可以知道如何以编程方式清除所有缓存吗?

要清除会话缓存,请使用session.clear()

要清除二级缓存,请使用此代码段

Bozho答案中指出的代码片段在Hibernate 4中已弃用。

根据Hibernate JavaDoc,您可以使用org.hibernate.Cache.evictAllRegions()

从所有查询区域中删除数据。

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

或者,您可以清除特定范围内的所有数据:

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

您可能想要检查JavaDoc for hibernate Cache接口(Hibernate 4.3) 。

而且,hibernate开发指南(4.3)中的二级缓存逐出 。

如果您插入Terracotta,您还可以运行Terracotta Dev Console,它可以检查有关缓存的统计信息,打开和关闭缓存,以及从用户界面清除缓存内容。

JMX bean也提供此function。

如果要清除二级缓存,请使用api sessionFactory.evictEntity(entityName)

码:

 /** * Evicts all second level cache hibernate entites. This is generally only * needed when an external application modifies the database. */ public void evict2ndLevelCache() { try { Map 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); } } 

有关二级缓存的更多详细信息, 请参阅

你也可以这样做

 request.getSession().invalidate(); response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0);