在查询和二级缓存中获得一致的返回时遇到问题Hibernate 3.3, ehCache 2.4.7, C3P0 0.9.1.2, MySQL(确认查询缓存关闭).
插入一个新对象并随后获取该对象有时(大约四分之一)无法返回插入的对象。我可以确认插入是通过直接数据库查询工作的。
插入的实体注释如下:@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
主键上的findById查询(它是一个字符串,即用户名,因为它是一个新用户创建过程)失败了。
当它和所有后续调用成功时,缓存命中被清除,并且不触发查询,如预期的那样。
有两个可疑的问题:
-
stats.getSecondLevelCacheStatistics
表示实体类型对象在缓存中,但记录缓存未命中。 - 显示在缓存丢失后触发查询,但它返回stale数据(在本例中,作为插入的空列表不是数据)返回)
我希望插入确保它进入缓存,或者即使没有工作,错过缓存命中,然后是正确的查询。然而,无法将对象放入缓存以及随后的查询失败是一个令人烦恼的组合。
希望这不是因为您设置的会话上的FlushMode
。如您所知,如果使用FlushMode.COMMIT
或FlushMode.MANUAL
(并且不调用手动刷新),则有可能获得陈旧的对象。