当前位置: 首页 > 面试题库 >

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

晏阳飙
2023-03-14
问题内容

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

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

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

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

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

感谢您将来的回答!


问题答案:

根据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的,我觉得你可以做同样的事情甲骨文这样的



 类似资料:
  • 我在看一些在线课程的播放列表,spring boot的测试项目。简单的积垢。它创建了一些表,但我决定更改一些字段的名称,从连接到mysql的cmd中删除了表。重新启动后,项目不会再次创建此表。我说的对吗,它存储在缓存中的某个地方,即表已经创建的记录?或者,例如,它是否将自动增量id的值存储在缓存中的某个位置?在第二次重新启动之后,spring只是因为一些登录缓存而不检查数据库中表的存在?如何在不从

  • 但是,应用程序的用法似乎并不符合标准的JPA方法,即在对象的每次更改时进行更新。 应用程序的使用情况是,每次只有几百个对象处于活动状态,但每秒更新几次。 虽然应用程序在内存中有对象,但不需要在数据库中不断更新它们,这将是无用的IO。

  • 我正在尝试使用Android Studio,第一次启动它,需要45分钟来编译...如果我不退出应用程序,那也没关系--每次后续编译/运行应用程序大约需要45秒。 我试着检查了我的一些缓存:在我的主目录中有一个文件夹,它包含123 MB。 我的项目文件夹中还有文件夹...其中一个大小为200 MB。我不敢随便用核弹攻击他们两个。删除文件夹的哪些部分是安全的? 有没有更好的解释为什么我的Android

  • Dokuwiki糊里糊涂地用了一年多,前两天忽然发现整个dokuwiki文件夹大得吓人,居然有130多MB,而我这个wiki站也就不到10个的页面。巡视一圈,冗余文件集中在 data/cache 缓存文件夹中,dokuwiki靠高速缓存提高页面加载速度,不过我的缓存文件实在太多了,居然有80多MB(大概因为时间太久了吧) 那么,开删!cache文件夹是不能删的,里面的1、2、3、a、b、c什么的全

  • 问题内容: 我已经读到,使用hibernate的二级缓存,它可以通过减少对数据/对象检索的数据库命中次数来提高应用程序性能。 但是,hibernate如何确保二级缓存与数据库中的数据保持最新。 例如: 假设下面的类是实体并且持久化到数据库中。 现在,如果我们启用了二级缓存,我知道如果打开不同的会话,则每个会话都将命中二级缓存以获取对象值。 现在,如果数据库中的数据发生更改(例如,对于ID = 1的