Hibernate二级缓存返回陈旧的数据(有时)



在查询和二级缓存中获得一致的返回时遇到问题Hibernate 3.3, ehCache 2.4.7, C3P0 0.9.1.2, MySQL(确认查询缓存关闭).

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

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

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

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

有两个可疑的问题:

  • stats.getSecondLevelCacheStatistics表示实体类型对象在缓存中,但记录缓存未命中。
  • 显示在缓存丢失后触发查询,但它返回stale数据(在本例中,作为插入的空列表不是数据)返回)

我希望插入确保它进入缓存,或者即使没有工作,错过缓存命中,然后是正确的查询。然而,无法将对象放入缓存以及随后的查询失败是一个令人烦恼的组合。

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