您的位置:首页 > 其它

mybatis一级缓存问题导致第二次查询结果出现变化

2017-06-21 21:56 316 查看

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),默认关闭。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis一级缓存
相关文章推荐