一尘不染

手动更新数据库后清除Hibernate 2级缓存

hibernate

不久,我将一个实体映射为在启用了二级缓存(只读策略)的数据库(Oracle)中查看-ehcache。

如果我手动更新数据库中的某些列,则不会更新缓存。

我没有找到任何方法可以做到这一点。仅当更新将通过Hibernate实体完成时。

我可以以某种方式实现此功能吗?

也许乔布监视表(或视图)?或者也许有某种方法可以通知Hibernate有关具体表中数据库的更改。

感谢您将来的回答!


阅读 210

收藏
2020-06-20

共1个答案

一尘不染

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

evictAllRegions()从缓存中逐出所有数据。

使用Session和SessionFactory:

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

1)如果您只需要更新一个实体(如果直接从数据库中更新,您将只更新某些实体),而不是整个会话,则可以使用

evictEntityRegion(ClassEntityClass)从给定区域驱逐所有实体数据(即

2)如果您有很多实体,可以直接从db更新,则可以使用此方法从第二级缓存中逐出所有实体(我们可以通过JMX或其他管理工具向管理员公开此方法):

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

3)另一种方法被描述这里的PostgreSQL +Hibernate的,我觉得你可以做同样的事情甲骨文这样的

2020-06-20