【问题标题】:Hibernate caching and database consistencyHibernate 缓存和数据库一致性
【发布时间】:2015-09-07 20:43:44
【问题描述】:

我有一个关于 Hibernate 缓存的问题。

我的理解是使用Hibernate缓存来避免频繁访问数据库。因此我们使用 Hibernate 缓存机制 来获得性能。

如果在数据库中添加一条新记录,在使用缓存的时候,如果我们不命中数据库,那么新添加的记录如何获取呢?

缓存仍然会获取旧记录,对吗?有人可以解释一下这是如何工作的吗?

【问题讨论】:

    标签: java database hibernate caching orm


    【解决方案1】:

    每个缓存并发策略都有一个关联的cache synchronization mehcanism

    1. NONSTRICT_READ_WRITE 是直读缓存,因为实体在从数据库中获取时(而不是在持久化时)存储在缓存中。更新实体会导致实体缓存条目失效。

    2. READ_WRITE 是异步直写缓存策略,因为数据库和缓存不是事务更新的。软锁用于保证一致性。

    3. TRANSACTIONAL 是一种同步缓存策略,因为数据库和缓存都是原子更新的。

    Hibernate 支持强一致性,因此 READ_WRITE 和 TRANSACTIONAL 缓存一致性类似于READ_COMMITTED isolation level。在 NONSTRICT_READ_WRITE 中,仍然可能出现过时的记录。

    【讨论】:

      【解决方案2】:

      Cache 是一个存储数据的组件,以便将来请求该数据 可以更快地送达;存储在缓存中的数据可能是结果 较早的计算,或存储在其他地方的数据的副本。 当请求的数据可以在缓存中找到时,就会发生缓存命中, 而缓存未命中在不能发生时发生。

      .

      为了避免频繁命中数据库,我们使用hibernate 缓存机制以获得性能。

      是的。

      如果新记录已添加到数据库中,使用缓存,如果我们 不打数据库,新添加的记录会怎样 捡到了吗?

      我们不会在缓存命中的情况下访问数据库,但是如果有缓存未命中,则必须从数据库中获取值。

      在初始化时,缓存是空的。每当您第一次访问记录时,它都不会在缓存中。如果您访问一条记录,则该记录首先会在缓存中检查,因为缓存为空,因此会发生缓存未命中。由于缓存未命中,将从数据库中获取记录。从数据库中取出的记录被放入缓存中,这样下次访问记录缓存命中,就不会访问数据库了。

      请注意,可以在缓存中存储多少数据/记录是有限制的。由于可用的存储空间有限,缓存主要使用最近最少使用算法从缓存中删除最近最少使用或最旧访问的记录。因此,即使您之前可能访问过一条记录,它也可能会被从缓存中逐出(缓存未命中)。需要数据库命中才能再次获取该记录。是的,该记录将再次添加到数据库中。

      【讨论】:

        【解决方案3】:

        “如果在数据库中增加了一条新记录,在使用缓存的时候,如果我们没有命中数据库,那新增加的记录怎么获取呢?”

        我们将在数据库中查找新记录,因为它不会在缓存中。然后将其存储在缓存中,并准备好在后续请求中从那里提供服务。

        “缓存仍然获取旧记录对吗?”

        如果您的意思是更新行时会发生什么,那么 Hibernate 也会更新缓存中的行(反汇编实体)或使其无效(取决于集群环境中的缓存并发策略和缓存拓扑)。

        但是,如果通过另一个应用程序更新数据库中的行,而 Hibernate 没有意识到这一点,那么您是对的,陈旧的数据将从缓存中提供(直到陈旧的条目过期或从缓存中清除)。

        【讨论】:

          猜你喜欢
          • 2014-02-03
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 2012-05-07
          • 2012-03-18
          • 2011-02-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多