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

时间:2015-05-23 13:34:05

标签: java hibernate second-level-cache

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

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

例如:

假设下面的类是实体并持久保存到数据库中。

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

现在,如果我们启用了二级缓存,我理解如果我们打开不同的会话,那么每个会话都将访问二级缓存以检索对象值。

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

通常,hibernate如何确保二级缓存中的数据与db值一致。

感谢您的帮助。

2 个答案:

答案 0 :(得分:10)

Hibernate自己管理缓存,所以当你更新某个实体通过休眠会话时,它会使与该实体关联的缓存条目无效 - 所以缓存总是新鲜的。

如果另一个进程(甚至运行相同hibernate应用程序的第二个JVM)更新数据库中的记录,则第一个JVM上的Hibernate不会意识到这一事实,并且在其缓存中有陈旧对象。

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

如果您使用EhCache缓存提供程序,则可以提供此类配置:

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

您可以在此处找到更多信息abount L2 cache: http://www.tutorialspoint.com/hibernate/hibernate_caching.htm

然而,有很多有用的教程。

答案 1 :(得分:5)

它没有。

如果您在不使用hibernate的情况下更改数据库中的数据,则无法了解它,您的缓存和数据库也会不同步。