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

时间:2010-03-17 09:31:12

标签: java hibernate orm ehcache

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

7 个答案:

答案 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);