hibernate 如何确保二级缓存使用数据库中的最新数据进行更新

How hibernate ensures second level cache is updated with latest data in database

我读到过使用 hibernate 的二级缓存,它可以通过减少数据/对象检索的数据库命中来提高应用程序性能。

但是,hibernate 如何确保二级缓存与数据库中的数据保持同步。

例如:

假设以下 class 是实体并保存到数据库中。

@Entity
class User {
    Id
    private int id;
    private String str;
}

现在,如果我们启用了二级缓存,我知道如果我们打开不同的会话,那么每个会话都会命中二级缓存以检索对象值。

现在,如果数据库中的数据发生变化(例如,对于 id=1 的行),比如通过一些独立的进程/手动更改值,并且我们尝试访问该值,hibernate 如何检测到缓存是具有最新值(对于 id = 1)。

一般来说,hibernate是如何保证二级缓存中的数据与db值一致的。

感谢您的帮助。

没有。

如果您在不使用 hibernate 的情况下更改数据库中的数据,它不会知道,并且您的缓存和数据库会不同步。

Hibernate 自己管理缓存,因此当您通过 Hibernate Session 更新 某个实体时,它将 无效 与该实体关联的缓存条目 -所以缓存总是新鲜的。

如果另一个进程(甚至是第二个 JVM 运行 同一个休眠应用程序)更新数据库中的记录,第一个 JVM 上的休眠将不知道这一事实并且过时他缓存中的对象。

但是您可以使用任何您想要的缓存实现(缓存提供程序)。有许多生产就绪的缓存提供程序允许您配置给定实体将在缓存中存储多长时间。例如,您可以将缓存配置为在 30 秒后使所有实体失效等等。

如果你使用 EhCache 缓存提供程序,你可以提供这样的配置:

<cache name="com.my.company.Entity" 
   maxElementsInMemory="1000" 
   eternal="false" 
   timeToIdleSeconds="7200" 
   timeToLiveSeconds="7200" 
   overflowToDisk="false" 
   memoryStoreEvictionPolicy="LRU"/>

您可以在此处找到有关二级缓存的更多信息: http://www.tutorialspoint.com/hibernate/hibernate_caching.htm

但是有很多关于此的有用教程。