我正在使用二级缓存和查询缓存。 我可以知道如何以编程方式清除所有缓存吗?
答案 0 :(得分:29)
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()
您可能需要查看the JavaDoc for hibernate Cache interface (Hibernate 4.3)。
另外,来自hibernate dev guide(4.3)的second-level cache eviction。
答案 1 :(得分:16)
要清除会话缓存,请使用session.clear()
要清除二级缓存,请使用this code snippet
答案 2 :(得分:3)
如果您插入Terracotta,您还可以运行Terracotta Dev Console,它可以检查有关缓存的统计信息,打开和关闭缓存,以及从用户界面清除缓存内容。
此功能也可从JMX bean获得。
答案 3 :(得分:1)
@Dino的答案几乎对我有用,但是我从sessionFactory.getCurrentSession()
收到一个错误(未配置currentSessionContext!)。我发现这对我有用:
// 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.
}
答案 4 :(得分:1)
与@Dino的答案相同,缩短了JPA 2.0 API的语法:
@Autowired
private EntityManagerFactory entityManagerFactory;
public void clearHibernateCaches() {
entityManagerFactory.getCache().unwrap(org.hibernate.Cache.class).evictAllRegions();
}
答案 5 :(得分:0)
如果要清除二级缓存,请使用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<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);
}
}
有关二级缓存refer
的更多详细信息答案 6 :(得分:-10)
你也可以这样做
request.getSession().invalidate();
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);