首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hibernate如何确保使用数据库中的最新数据更新二级缓存

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

Stack Overflow用户
提问于 2015-05-23 21:34:05
回答 2查看 11K关注 0票数 11

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

然而,hibernate如何确保二级缓存与数据库中的数据保持最新。

例如:

假设下面的类是entity,并持久化到DB中。

代码语言:javascript
复制
@Entity
class User {
    Id
    private int id;
    private String str;
}

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

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

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

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-23 22:13:08

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

如果另一个进程(或者运行相同hibernate应用程序的第二个JVM )更新数据库中的记录,第一个JVM上的Hibernate不知道这一事实,并且在他的缓存中有陈旧的对象。

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

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

代码语言:javascript
复制
<cache name="com.my.company.Entity" 
   maxElementsInMemory="1000" 
   eternal="false" 
   timeToIdleSeconds="7200" 
   timeToLiveSeconds="7200" 
   overflowToDisk="false" 
   memoryStoreEvictionPolicy="LRU"/>

你可以在这里找到更多关于L2缓存的信息:http://www.tutorialspoint.com/hibernate/hibernate_caching.htm

然而,有很多关于这方面的有用的教程。

票数 14
EN

Stack Overflow用户

发布于 2015-05-23 21:58:45

事实并非如此。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30413321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档