【问题标题】:Hibernate Second Level Cache Returning Stale Data (sometimes)Hibernate 二级缓存返回陈旧数据(有时)
【发布时间】:2011-12-28 18:20:30
【问题描述】:

无法从查询和二级缓存中获得一致的返回 Hibernate 3.3、ehCache 2.4.7、C3P0 0.9.1.2、MySQL(已确认查询缓存已关闭)。

插入一个新对象并随后获取该对象有时(大约四分之一)无法返回插入的对象。我可以确认插入正在通过直接数据库查询进行。

插入的实体被注释为:@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

这是对主键(这是一个字符串,用户名,因为它是一个新的用户创建过程)的 findById 查询失败。

当它成功并且所有后续调用时,缓存命中都是清除的,并且不会触发任何查询,正如预期的那样。

有两个可疑的问题:

  • 实体类型的stats.getSecondLevelCacheStatistics 显示 缓存中的对象,但记录了缓存未命中。
  • 显示在缓存未命中后触发查询,但它返回陈旧 数据(在这种特定情况下,插入的空列表不是 返回)

我希望插入能够确保它进入缓存,或者即使这不起作用,也会错过缓存命中,然后是正确的查询。然而,未能将对象放入缓存,以及随后的失败查询,是一个令人烦恼的组合。

【问题讨论】:

    标签: java mysql hibernate ehcache


    【解决方案1】:

    希望这不是因为FlushMode 在您设置的会话中。如您所知,如果使用 FlushMode.COMMITFlushMode.MANUAL(并且未调用手动刷新),则有可能获得陈旧的对象。

    【讨论】:

    • 我应该提到 - 我确实检查过,它仍然设置为默认值 (FlushMode.AUTO)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多