【问题标题】:How hibernate ensures second level cache is updated with latest data in databasehibernate 如何确保使用数据库中的最新数据更新二级缓存
【发布时间】:2015-08-05 10:59:05
【问题描述】:

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

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

例如:

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

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

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: java hibernate second-level-cache


    【解决方案1】:

    Hibernate 自己管理缓存,因此当您通过 hibernate Session 更新某些实体时,它将使与该实体关联的缓存条目无效 - 因此缓存始终是新的。

    如果另一个进程(甚至是运行相同休眠应用程序的第二个 JVM)更新数据库中的记录,则第一个 JVM 上的 Hibernate 不知道这一事实,并且在其缓存中具有 stale 对象。

    但是,您可以使用任何您想要的缓存实现(缓存提供程序)。有许多生产就绪的缓存提供程序允许您配置给定实体将在缓存中存储多长时间。例如,您可以将缓存配置为在 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

    但是有很多有用的教程。

    【讨论】:

    • 非常感谢您提供详细信息。那么,我们可以将其视为使用休眠的缺点之一吗?有什么补救措施吗?
    • 这不是hibernate的问题,而是缓存的原理问题。众所周知,IT 存在 10 个问题:命名事物、缓存失效和一个错误
    • @Jens 是的,命名可能是最糟糕的 :)
    • @vipin 缓存策略应取决于项目的具体需求。例如,对于某些项目,如果表不经常更新 - 您可以使用 timeToLive=10 分钟缓存此表的实体,但对于经常更新的表,您可以设置 timeToLive=10 秒或不缓存它们
    【解决方案2】:

    它没有。

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

    【讨论】:

    • 如果同一应用程序中的某些组件更改了值(使用休眠),它如何跟踪更改?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2012-12-31
    • 2019-09-01
    相关资源
    最近更新 更多