【问题标题】:Ehcache stores but not retrieves (Ehcache + Hibernate)Ehcache 存储但不检索(Ehcache + Hibernate)
【发布时间】:2012-07-19 05:11:35
【问题描述】:

我正在使用 ehcache 通过 hibernate 来缓存实体。

查看 ehcache 监视器,一切似乎都工作正常(刷新将缓存计数归零,然后重新加载将计数归为一),但如果我直接在 db 上更改某些值并重新加载,则会显示更新的值而不是缓存的。我不知道这是否是预期的行为,但作为缓存这样做会很奇怪。

我已经尝试了所有找到的解决方案,但没有成功。

【问题讨论】:

  • 对于缓存,您确实希望查看数据库中的值 - 缓存是数据库的副本。
  • 确实是这样,但是如果在缓存过期之前改变一个值,它必须返回缓存的值,对吧?除非缓存可以足够智能地检测到 db 上的值变化
  • db 或 cacjh 哪个是正确的值 - 如果缓存为什么不在 db 中?
  • 假设以下步骤: 1. DB 有值 'a' 2. 点击页面,缓存存储值 'a' 3. 使用值 'b' 更新 DB(在缓存过期之前) 4.刷新页面并获取值'b'我不知道缓存是否也更新了,或者jpa是否直接从数据库读取从而绕过缓存。
  • 我遇到了同样的问题并在这里找到了解决方案stackoverflow.com/questions/11563685/…

标签: hibernate jakarta-ee ehcache


【解决方案1】:

这是预期的行为。数据库是所有正确数据的来源,缓存只是为了加快对数据库中数据的访问。如果数据不同,则根据定义,缓存是错误的。

因此,如果您重新加载缓存,则会从数据库中重新加载。

如果您通过 Hibernate 保存数据,则数据将写入缓存和数据库。当您有多个线程/进程读取或写入时,这里可能会出现问题。有关如何管理,请参阅caching strategies in the Hibernate documentation

一般而言,更新数据库会直接导致缓存不包含正确数据的问题,除非通知它必须使其拥有的数据无效和/或从数据库重新加载。

【讨论】:

  • 其实我是直接在数据库中更新数据,是为了测试hibernate获取缓存数据而不是存储在数据库中
  • @Jame 你不是很清楚 - 因为我们的目标始终是获取与数据库中相同的数据 - 你是在尝试测试特定错误吗?
  • 我正在尝试测试缓存是否正常工作。我知道缓存背后的想法是加快访问时间,但是如果我直接更改缓存的源(在这种情况下是数据库),则返回的值必须是缓存的值,而不是源上的更改值,否则缓存将像直接读取源一样执行
  • @Jams - 对不起,我很困惑 - 理想情况下,缓存应该始终包含数据库拥有的数据 - 并且数据库始终正确 - 值不匹配然后缓存有错误而不是数据库
猜你喜欢
  • 2011-11-30
  • 2010-11-20
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多