【问题标题】:What is the difference between CacheStoreMode USE and REFRESHCacheStoreMode USE 和 REFRESH 有什么区别
【发布时间】:2014-06-18 19:58:19
【问题描述】:

CacheStoreMode 的 javadocs 有一点我无法真正理解:

USE 模式的 javadocs:

在从数据库读取时以及何时将实体数据插入/更新到缓存中 提交到数据库:这是默认行为。不强迫 从数据库读取时刷新已缓存的项目。

REFRESH 模式的 javadocs 在最后一句中有所不同:

强制刷新从数据库读取的项目的缓存。

当从数据库读取时更新现有缓存实体实例时,这通常会涉及覆盖现有数据。那么在这种情况下,强制刷新和不强制刷新有什么区别呢?

谢谢。

【问题讨论】:

    标签: java jakarta-ee caching jpa jpa-2.0


    【解决方案1】:

    我认为,需要数据库中最新更新数据的位置,以及从后端而不是通过应用程序更新数据的位置会有所不同。

    在我的应用程序中,情况相同(但没有使用任何缓存策略),我们每次都必须加载所有数据;因为它通过来自外部系统的消息被隐式修改,否则我们将处理陈旧的数据。

    在少数情况下,计划作业、外部系统等直接更新数据库CacheStoreMode.REFRESH 是合适的;而对于正常情况CacheStoreMode.USE

    [除此之外,我不记得任何其他情况,这可能会在这两种模式之间产生差异]


    编辑:文档似乎令人困惑且太短而无法正确解释。此外,在原生查询、批量更新等情况下,项目会被跳过且不会被缓存。

    CacheStoreMode.USE:只有新项目被放入缓存,而不是已经缓存的项目。 CacheStoreMode.REFRESH: 新项目被放入缓存中,已经存在的缓存项目被刷新。

    【讨论】:

    • 感谢您的回答,纳扬。恐怕我仍然没有得到区别:) USE 模式在从数据库和REFRESH 读取数据时会更新数据,区别应该是强制的更新。持久性提供程序检查什么状态以及何时未更新共享缓存中的状态,因为它将是“强制”的?
    • @kostja 现在我也没有让你感到困惑:) 我认为对象是根据对象身份直接替换的,而不是更新的。我已经更新了帖子,请参阅编辑部分。
    【解决方案2】:

    据我所知:

    • 如果给定的 EntityManagerFactory 对底层数据库具有独占写入访问权限,则应使用 CacheStoreMode.USE,因此这意味着存储在 共享缓存 中的实体实例不可能过时。李>
    • 如果底层数据库可能被多个提交者访问(即 EntityManagerFactory 实例、不同 JVM 中的应用程序、外部 JDBC 源),则应启用CacheStoreMode.REFRESH,因此存储在共享缓存中的实体实例可能会变得陈旧。

    由于 CacheStoreMode.USE 在从数据库读取时不会强制刷新已缓存的实体,因此 CacheStoreMode.REFRESH 会。

    【讨论】:

      猜你喜欢
      • 2016-09-01
      • 2017-01-17
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2010-11-25
      • 2011-10-31
      相关资源
      最近更新 更多