mybatis/mybatis plus lambda会话缓存失效(2)

文章介绍了在微服务场景中,为解决频繁查询同一表数据导致性能问题,选择使用ThreadLocal在service层创建会话级缓存,避免了全局缓存的复杂性。通过在查询接口上添加判断,从ThreadLocal获取数据,若为空则从数据库查询并缓存。同时,为确保会话结束后缓存清除,添加了ThreadLocalContextFilter。此解决方案虽通用性较弱,但成本较低,成功将查询时间减半。
摘要由CSDN通过智能技术生成

书接上回,有两个解决方案
1 写一个类似spring cache的功能在service层做会话级缓存(微服务场景,全局缓存不行)
2 重新baseExecutor的query方法,在mybatis层面上加标签注明表,只刷新同表数据

最终选择了类似1的解决方案,用了ThreadLocal类,在线程内做一个缓存(参考 实现ThreadLocalContext管理线程变量),由于我的这个功能在单次请求内反复查询了多个表的数据,但是查询最多的表是有限的,并且我的系统分运行态和设计态,这张表是设计态的表,接口是运行接口设计表几乎不会修改,因此不考虑并发等问题。所以在这张表的查询接口上包了一个判断ThreadLocalContext.get(数据id)是否为空,不为空则直接返回,为空则入库查询并缓存。这种实现方案通用性较弱,但是整体成本低。
原接口是调用serviceImpl的getById,修改为

@Override
public AObject getById(Serializable idSer){
	String id = (String)idSer;
	AObject aObject = ThreadLocalContext.get(id);
	if(aObject == null){
		return baseMapper.selectById(id);
	}else{
		return aObject;
	}
}

在原来的机制下,由于每次调用DML语句都会清空所有mybatis缓存,设计态的表被反复查询,整个接口的调用时长超过了一秒,优化后时间减半。

并且添加了一个ThreadLocalContextFilter,确保每次会话结束时缓存会被清空,如果没有这个类的话,很难把握数据初始化和清空的时机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值