栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记一次mybatis-plus数据自动填充爆露出来的多线程的问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记一次mybatis-plus数据自动填充爆露出来的多线程的问题

技术背景:

spring boot+mybatis-plus做公共字段填充(metaObjectHandler),之前项目没有接入用户系统故用户名填充都是使用的默认值,最近公司整合统一网关,接入用户信息,单例模式使用

ThreadLocal> threadLocal记录当前登陆用户信息,一切看似正常,用户信息获取都正常填充记录入库。

但是测试组细心的小姐姐发现有一个接口调用的过程中发生用户名被还原成默认值的情况,一开始还不信。仔细观察发现这个接口存入的用户最终都变成了默认用户名。

抓鸡。。。。。。。

为什么呢,debug发现整个流程没问题啊,出问题也只有可能自动填这里充出问题了,断点进去果然发现这个接口的实现方法进来后threadLocal变成了null,其他方法进来都是正常的,怎么会出现这种情况呢,怀疑人生中。。。。。。

突然眼前一亮发现有猫腻,这个方法是异步实现的@Async,当初因为这个方法后台执行比较耗时,所以采用异步的方式,而spring boot中使用@Async是通过线程池,想到这里就不奇怪了  这就涉及到主线程和子线程数据共享的问题了,刚好之前了解过,赶紧把ThreadLocal的实现换一下inheritableThreadLocals测试一波,呵呵果然。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/271953.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号