首页 > mybatis多mapper select join出现缓存不一致问题

mybatis多mapper select join出现缓存不一致问题

假设有两个Mapper:AMapper、BMapper,分别对应两个表:ATable、BTable
AMapper和BMapper中均已配置
两个Mapper均已实现对相对应单表的CURD方法

AMapper中存在 select a.name, b.name from ATable a left join BTable b on a.id = b.fid 查询方法。

这时,通过BMapper修改BTable中的数据,然后使用AMapper上述方法获取两个表join后的数据,这时会发现结果集中的数据不是修改后的最新数据。

原因:MyBatis中每个Mapper定义了不同的namespace,不同Mapper中的<cache/>也拥有不同的namespace,而当update之后,MyBatis只会刷新当前namespace下的cache,其他namespace下的cache并不刷新。
拿上面那个例子来说,BMapper更新数据后,BMapper下的cache被刷新,而AMapper下的cache并没有被刷新,这时如果通过AMapper使用select join来获取BTable中的数据,那么便会命中AMapper下的cache,从而出现缓存不一致的问题。

可能有人说把两个Mapper中的<cache/>使用cache-ref属性声明为同一个namespace下的缓存就好了,一有update,所有cache全部刷新。但是实际项目中根本不可能这么用(因为这样的话用不用缓存没有多大区别,稍微一个更新,缓存就刷新了)。

我查了一些资料,想采取在程序中手动join的方式:每个Mapper仅提供对应表的基本curd操作,join全部提到应用程序中做,为了防止出现n+1问题,就采用where id=[const] && where fid in [const,const...]来减少查询次数。

但是本人经验有限,不知道上述做法是否合适,望各路大神给予指点,多谢!

【热门文章】
【热门文章】