为了账号安全,请及时绑定邮箱和手机立即绑定

mapper二级缓存和分页插件的问题

mapper层二级缓存和分页里多租户解析器的问题,

A租户第一次执行了一个语句,还没有缓存,通过分页插件动态加了租户条件,取出并缓存了数据Adata,但是缓存的key是不带租户条件的。

B租户执行了和A租户相同的语句,命中了Adata的缓存(缓存key同样不带租户条件),直接取出了Adata的数据,导致数据不对

讲道理的话,A和B如果都是先经过分页插件加上了租户过滤条件,再判断缓存的话,就不会命中错误的缓存。

二级缓存也和分页查询总数有冲突,列表查询的时候,命中的缓存,就不会再去查询总数,导致返回的total是0

不知道是否是使用方式不对,如何解决,查很久的资料了,求指导一下

正在回答

3 回答

如果你可以考虑关闭mapper层二级缓存,将缓存放到service层的话。那么修改后再试试,看是否依然还存在问题,如果还有问题,可以再反馈给我。

1 回复 有任何疑惑可以回复我~
#1

慕仙7039684 提问者

首先感谢回复。 系统并没有较复杂的数据需要处理,一般返回的结果就是mapper层直接出来的结果,所以想用mapper二级缓存比较方便。 翻遍个官方文档,只找到了如下说明:“我们建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现。 当然如果你是一个极端分子,请使用 CachePaginationInterceptor 替换默认分页,这样支持分页缓存。”;
2019-08-27 回复 有任何疑惑可以回复我~
#2

慕仙7039684 提问者

但是,在3点多的版本里,已经没有CachePaginationInterceptor这个插件了(虽然3点多的使用文档还是这么写的),查找了更新日志,也没找到CachePaginationInterceptor变动的说明,实在没招,确实要使用mapper二级缓存的话,能解决吗
2019-08-27 回复 有任何疑惑可以回复我~
#3

老猿 回复 慕仙7039684 提问者

我也查看了官方文档,在MP3.x中没有找到CachePaginationInterceptor,目前我也解决不了这个问题。你如果着急,可以在github上的MP项目中提交issue,描述清楚你所遇到的问题,相信官方会答复的。我这边最近工作比较忙,如果你不着急,过些日子,我照着你说的看能否复现问题,然后由我向MP官方反馈。
2019-08-28 回复 有任何疑惑可以回复我~
#4

慕仙7039684 提问者 回复 老猿

不着急,目前暂时使用AOP在mapper层方法执行之前,对租户字段的值进行设置,可以满足使用,但感觉不太合适。您这边有空的时候,还请帮忙测试并反馈一下
2019-09-06 回复 有任何疑惑可以回复我~
#5

老猿 回复 慕仙7039684 提问者

你好,你说的这个问题,我没复现出来,我在mapper接口的xml文件中加入<cache></cache>开启二级缓存。我在yml中也设置了cache-enabled: true。用非分页查询和查询,模拟两个租户的信息都正常,分页查询取得的总记录数也正常,我使用的mp版本是3.1.2。你那边是怎么设置的,要方便的话,你提供给我源代码或者贴出部分源代码。
2019-09-23 回复 有任何疑惑可以回复我~
#6

老猿 回复 慕仙7039684 提问者

你说的问题我用mp自带的方法没有复现出来,用自定义的方法复现出来了,并且提了issue,6楼和7楼就是issues的地址,不知道为啥网站把我的话截断了,只显示出链接后的字,所以发了两遍。
2019-09-23 回复 有任何疑惑可以回复我~
#7

慕仙7039684 提问者 回复 老猿

最近比较忙,忘了这茬,现在抽空上来学习才看到您的回复,抱歉。 在您提交的issue里,看到了另一个人贴的issue链接和青苗的回复,看似已经修复了这个问题。 非常感谢您的反馈
2019-10-29 回复 有任何疑惑可以回复我~
#8

老猿 回复 慕仙7039684 提问者

呵呵,没有关系,不用抱歉,青苗是MP所属开发组织的负责人,我想下一版本应该能解决这个问题。
2019-11-01 回复 有任何疑惑可以回复我~
查看7条回复

MP的作者建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现。

0 回复 有任何疑惑可以回复我~

哥, 这个问题怎么解决啊

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

mapper二级缓存和分页插件的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信