mybatis一级缓存问题导致第二次查询结果出现变化,一个事务中相同查询方法,不同结果
1.问题回顾:
同样的查询方法,第一次查询的结果正常,第二次查询的结果出现变化
框架springmvc+mybatis
2 原因分析验证:
在同一个事物中获取数据出现误差,初步怀疑是mybatis一级缓存的问题的,二级缓存未启动,如果是一级缓存,第二次查询是在内存中获取的,所以需要查询内存地址是否一致
执行方法:
freighttemplet=freighttempletMapper.selectByPrimaryKey(freighttempletVo.getId()); |
2.1第一次查询
内存地址id:1372
对象中addCount值为1.0 |
2.2第二次查询
内存地址id: 1372 对象中addCount值变化为0 |
2.3结论
在第一次查询执行完后有对获取的对象进行修改,导致第二次获取时是修改后的数据,出现问题
修改对象代码如下:
3解决方案:
在mybatis的mapper xml里配置每次清空缓存flushCache:
4.修改后再次测试
4.1第一次查询
4.2第二次查询
查看结果两次获取的数据是一致,成功!
5总结
同一个事务中,如果有重复查询,注意刷新mybatis一级缓存
6附录(COPY)
6.1mybatis缓存介绍
一级缓存
即session缓存,作用域为 Session,当 Sessionflush 或 close 之后,该Session中的所有 Cache 就将清空,默认开启。
注意 集成spring(使用mybatis-spring)时:
每次查询spring会重新创建SqlSession,所以一级缓存是不生效的。
而当开启事务时,spring会使用同一个SqlSession做查询,所以这个情况下一级缓存是生效的
即全局缓存,其作用域为Mapper(Namespace),默认关闭。