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

标签 java mysql hibernate ehcache

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

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

插入的实体是这样注释的:@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

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

当它成功以及所有后续调用时,缓存命中将被清除,并且不会像预期的那样触发任何查询。

有两个可疑的问题:

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

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

最佳答案

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

关于java - Hibernate 二级缓存返回陈旧数据(有时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8659670/

相关文章:

java - 如何在Java FX中设置相对单位的类别差距?

php - 为什么apache2服务器不处理下面的php文件

java - 验证 Xml、Xsd 并转换为其他 Xml

java - 在 jpql 查询 select 中传递参数

MySQL 自连接花费的时间太长——我可以简化这个查询吗?

mysql - 安装 mysql2 0.3.13

hibernate - 在 hibernate 中设置 session 或事务的超时

java - 如何在 Hibernate 中使用删除查询

java - 在运行时获取有关实体的 hibernate 信息

java - Guice:绑定(bind)非直接依赖项