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第一次查询查看结果两次获取的数据是一致,成功!
5总结
同一个事务中,如果有重复查询,注意刷新mybatis一级缓存6附录(COPY)
6.1mybatis缓存介绍一级缓存
即session缓存,作用域为 Session,当 Sessionflush 或 close 之后,该Session中的所有 Cache 就将清空,默认开启。
注意 集成spring(使用mybatis-spring)时:
每次查询spring会重新创建SqlSession,所以一级缓存是不生效的。
而当开启事务时,spring会使用同一个SqlSession做查询,所以这个情况下一级缓存是生效的
二级缓存
即全局缓存,其作用域为Mapper(Namespace),默认关闭。
相关文章推荐
- mybatis一级缓存问题导致第二次查询结果出现变化
- 开发日志:HQL关联查询出现语句正确,但一直查询不出结果的问题
- 解决在mybatis中使用CTE进行oracle查询数据类型为long的字段出现流关闭问题
- Mybatis事务下解决多次select语句查询结果一致的问题+案列(获取全局序列ID)
- MyBatis解决字段名和实体类属性名不相同冲突问题时返回查询结果为空
- Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_L及由于排序规则不同导致查询结果为空的问题
- 关于Mybatis模糊查询出现的问题
- PLSQL查询结果复制时出现乱码的问题
- Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_L及由于排序规则不同导致查询结果为空的问题
- Mybatis的一级缓存导致的异常问题解决
- mybatis处理查询map列表属性为null的问题,而导致查询map无该key对象
- MyBatis 解决查询结果Map中,值为null,不存储键值的问题
- 关于linq to sql调用存储过程,出现"无法枚举查询结果多次"的问题
- MyBatis联合主键结果集与SQL查询结果不一致的问题
- top 和order by导致查询结果不一致的问题
- Teradata数据中包含换行符导致查询结果导出串行问题
- 关于Oracle字段类型Date使用mybatis generator自动生成工具出现的查询日期只精确到年月日问题
- 【less.js扫雷系列一】--less和CSS同时时使用时,可能出现的样式优先级变化导致样式覆盖问题
- mybatis 在name 模糊查询时出现问题以及解决方法
- 【问题解决】MyBatis分页查询SQL Server2008时出现'@P0' 附近有语法错误