mybatis将查询结果缓存后,改变查询结果的实体对象的值,再次执行mybatis的查询语句,得到的数据为改变后的实体对象,而不再是数据库中的数据。
现象:
通过mapper执行了一个查询语句后,对查询的实体进行处理,再此执行了查询语句,返回的结果对象为处理后的数据,对查询再次处理出现异常。由于是跨service调用的,没有传实体对象而是传入ID参数再次执行查询,然后同样的查询语句,不同service返回的数据不一样。于是怀疑是缓存问题。
查询mybatis的缓存,了解到以及缓存为sqlsession级别,同样参数的查询语句,再次查询时实际从缓存中取。由于对第一次查询返回对象进行处理,第二次通过对象引用得到处理后的结果,而不是数据库的原始结果。
去掉mybatis的一级缓存。
1、通过在DAO方法中添加注解
@Options(flushCache = Options.FlushCachePolicy.TRUE)
没有起作用,应该是没有扫描DAO的注解
2、在xml的具体select方法中加属性flushCache=“true”
这次起作用了,执行两遍查询,都是数据库返回数据,而不是。
mybatis查询缓存与结果实体对象
于 2021-11-02 14:32:34 首次发布