Java hibernate如何确保用数据库中的最新数据更新二级缓存
我已经读到,使用hibernate的二级缓存,它可以通过减少数据/对象检索的数据库命中率来提高应用程序的性能 然而,hibernate如何确保二级缓存对数据库中的数据是最新的 例如: 假设下面的类是entity并持久化到DB中Java hibernate如何确保用数据库中的最新数据更新二级缓存,java,hibernate,second-level-cache,Java,Hibernate,Second Level Cache,我已经读到,使用hibernate的二级缓存,它可以通过减少数据/对象检索的数据库命中率来提高应用程序的性能 然而,hibernate如何确保二级缓存对数据库中的数据是最新的 例如: 假设下面的类是entity并持久化到DB中 @Entity class User { Id private int id; private String str; } 现在,如果我们启用了二级缓存,我知道如果我们打开不同的会话,那么每个会话都将命中二级缓存以检索对象值 现在,如果数据库中的
@Entity
class User {
Id
private int id;
private String str;
}
现在,如果我们启用了二级缓存,我知道如果我们打开不同的会话,那么每个会话都将命中二级缓存以检索对象值
现在,如果数据库中的数据发生更改(例如,对于id=1的行),比如通过一些独立的进程/手动更改值,并且我们尝试访问该值,那么hibernate如何检测缓存具有最新的值(对于id=1)
通常,hibernate如何确保二级缓存中的数据和db值一致
谢谢你的帮助。没有
如果您在不使用hibernate的情况下更改数据库中的数据,它将不知道该数据,您的缓存和数据库将不同步。hibernate自己管理缓存,因此,当您通过hibernate会话更新某个实体时,它将使与该实体关联的缓存项无效,因此缓存总是新鲜的 如果另一个进程(甚至运行同一hibernate应用程序的第二个JVM)更新数据库中的记录,则第一个JVM上的hibernate不知道这一事实,并且在其缓存中有stale对象 但是,您可以使用您想要的任何缓存实现(缓存提供程序)。有许多生产就绪缓存提供程序允许您配置给定实体在缓存中存储的时间。例如,您可以将缓存配置为在30秒后使所有实体无效,依此类推 如果使用EhCache缓存提供程序,则可以提供以下配置:
<cache name="com.my.company.Entity"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="7200"
timeToLiveSeconds="7200"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"/>
您可以在此处找到有关NT二级缓存的更多信息:
但是,关于这方面有很多有用的教程。如果同一应用程序中的某些组件更改了值(使用hibernate),它如何跟踪这些更改?非常感谢提供详细信息。那么,我们是否可以将此视为使用hibernate的缺点之一?有什么补救办法吗?这与hibernate无关,但这是缓存的一个主要问题。正如我们所知,它有10个问题:命名事物和缓存失效,以及一个一个errors@Jens是的,命名可能是最糟糕的:)@vipin缓存策略应该取决于项目特定的需求。例如,对于某些项目,如果表不经常更新,则可以将该表的实体缓存为timeToLive=10分钟,但对于经常更新的表,可以将timeToLive=10秒,或者干脆不缓存它们