網站首頁 編程語言 正文
文章目錄
- AOP+注解方式實現多數據源原理
- 可能遇到的問題
- 情景1:指定數據源的請求中發生報錯
- 情景2:指定數據源的請求中使用新的線程
AOP+注解方式實現多數據源原理
通過ThreadLocal的線程隔離性將設線程與數據源ID進行綁定:
- 若不設置則使用默認數據源
- 若設置則使用該數據源ID對應的數據源(注意:使用完后需要清除該數據源ID)
可能遇到的問題
情景1:指定數據源的請求中發生報錯
問題描述:指定數據源的請求中發生報錯,后面未指定數據源的請求卻使用了該指定數據源(應該使用默認數據源)。
代碼:
@Slf4j
@Aspect
@Order(-2)
@Component
public class DataSourceAspect {
@Pointcut("@annotation(com.joker.datasource.aopannotation.DataSource) || @within(com.joker.datasource.aopannotation.DataSource)")
public void run(){
}
@Around("run()")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
// 方法上獲取
// AnnotatedElementUtils.hasAnnotation()
DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class);
if (Objects.isNull(dataSource)) {
// 類上獲取
dataSource = AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);
}
// 設置數據源
DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
Object obj = point.proceed();
// 清除數據源
DynamicDataSourceContextHolder.clearDataSourceType();
return obj;
}
}
問題分析:
- 指定數據源的請求中發生報錯,導致清除數據源ID未執行,當前線程thread1仍然綁定了該數據源;
- 由于接口請求使用的線程是通過線程池來管理的,后續該線程thread1可能會繼續分配給其它請求使用
- 如果后續請求使用了該線程thread1且未指定數據源,使用的仍然是前面綁定的數據源,導致使用錯數據源(原本應該使用默認數據源)
- 但如果后續請求使用了該線程thread1但指定了數據源,則不會有問題
情景2:指定數據源的請求中使用新的線程
問題描述:指定數據源的請求中使用新的線程,導致指定數據源無效,使用的是默認數據源。
問題分析:因為數據源是和線程綁定的,即使在當前線程綁定了指定數據源,但如果在請求中使用了新的線程,新線程是沒有綁定數據源的(默認使用默認數據源)。使用新線程的一下場景:
- 使用了new Thread()創建的新線程,在新線程中使用數據源
- 使用了線程池,通過線程池中的線程來使用數據源
- 使用了Java8中list.parallelStream()來并行處理(多線程處理),處理過程中使用數據
原文鏈接:https://blog.csdn.net/JokerLJG/article/details/131406803
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-08-19 Linux系統文件目錄介紹
- 2022-12-25 React安裝node-sass失敗解決方案分享_React
- 2022-10-15 Windows10搭建FTP服務器詳細教程_FTP服務器
- 2022-06-06 微信小程序實現滾動視圖點擊錨點跳轉、點擊左側分欄時右側對應內容置頂、左右分欄聯動、setTimeou
- 2022-05-20 ElasticSearch 7.X系列之:查詢分析索引磁盤使用空間_disk_usage
- 2022-03-16 linux下FastDFS搭建圖片服務器_Linux
- 2022-06-08 優化使用Feign進行Rpc調用,支持對象傳參自動轉換
- 2022-11-22 Python網絡請求模塊urllib與requests使用介紹_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支