加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:00:44 所属栏目:Java 来源:网络整理
导读:我已经读过使用hibernate的二级缓存,它可以通过减少数据库命中数据/对象来提高应用程序性能. 但是,hibernate如何确保二级缓存与数据库中的数据保持同步. 例如: 假设下面的类是实体并持久保存到DB中. @Entityclass User { Id private int id; private String
我已经读过使用hibernate的二级缓存,它可以通过减少数据库命中数据/对象来提高应用程序性能.

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

例如:

假设下面的类是实体并持久保存到DB中.

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

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

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

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

谢谢你的帮助.

解决方法

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"/>

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

但是有很多有用的教程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读