zzss 发表于 2016-11-28 07:22:05

MyBatis关联查询,其中关联表有数据更新,如解决缓存更新的问题

最近开发项目遇到一个问题,大致情况如下:
使用MyBatis
select a.*,b.* from A a left join B b where a.b_id = b.id 对应的是AMapper.xml,这个数据被缓存了,若A表有更新,它的缓存也会被清掉,这是正常的。
update B set ......(此处省略了,就是更新B表) 对应的是BMapper.xml

执行操作,先执行上面的update更新B,然后执行上面的select关联查询,由于有缓存,查询出来的结果还是原来的,也就是说更新的B表时,select关联查询的缓存并不会更新。

查询了一些资料:
说明:在mybatis下每个mapper的namespace对应一个cache,也就是说一个cahce的id就是mapper的namespace, 当mapper中select 标签中使用useCache=true,那么该select语句就会被保存到cache中,某一个namespace下的某一个select语句可能会有不同的参数值,所以mybatis会分别把不同参值的sql查询结果保存到cache中去,也就是说同一个namespace下的同一个select语句会对应N个不同的cache,当前mybatis的缓存flush机制是得到namespace对应的缓存后直接clear, 这个的话,同一个namespace下的所有select语句所对应的缓存都被刷新。

了解这些后就可以解决这个问题了,解决的办法的是:把更新B表的update的语句放到AMapper.xml中,这样的话在AMapper.xml做更新B的操作,也就会刷新A的缓存,这样再去select关联查询B表就可以查询到更新后的数据了。
页: [1]
查看完整版本: MyBatis关联查询,其中关联表有数据更新,如解决缓存更新的问题