網站首頁 編程語言 正文
springboot實現動態數據源切換
為什么需要切換數據源?
當數據量超過500萬行時,數據庫就要考慮分庫分表和讀寫分離,有些業務背景需要動態切換數據庫。
當controller層處理請求,需要在dao層代碼執行之前能夠將數據源換成我們想要執行操作的數據源。
底層原理
Springboot內置了一個AbstractRoutingDataSource,將所有數據源裝入map,然后可以根據不同的key返回不同的數據源。當springboot開始執行連接數據庫之前會執行determineCurrentLookupKey()方法,這個方法返回的數據將作為key去map中查找相應的數據源。
需求
根據不同的請求實現動態切換,查詢不同的數據庫。
實現步驟
-
創建springboot工程,準備 數據庫 和 web相關的依賴
-
準備兩個數據庫的表,在項目中創建對應的pojo實體類
-
分別創建兩個數據庫對應的dao層、service層和controller層,核心啟動類上需要添加包掃描MapperScan
-
準備相關的數據源配置信息,在application.properties文件中設置
-
創建數據源自動配置類,當容器啟動時,創建對應的數據源bean對象
-
創建AbstractRoutingDataSource的子類,當springboot想要獲取數據源對象時,會執行determinCurrentLookUpKey()方法,獲取想要的數據源,所以需要重寫這個方法
先將返回值寫成固定字符串,后續實現動態獲取key,再進行修改。 -
在數據源自動配置類中添加AbstractRoutingDataSource子類bean的注入,當AbstractRoutingDataSource想要獲取數據源時,會從它的成員變量中存的數據源的map集合中獲取,所以需要給它注入包含兩個數據源的map集合
-
在核心啟動類上需要添加@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class} ),排除默認的數據源
-
如何實現動態獲取key?
每一個請求是一個單獨的線程,將key存入當前線程的ThreadLocal里面。創建新的對象RoutingDataSourceContext,存在唯一的ThreadLocal對象,在構造函數中傳入key,另外創建獲取方法和關閉方法。 -
在重寫的determinCurrentLookUpKey()方法中調用RoutingDataSourceContext動態獲取key的方法
11. 在controller層發起請求時獲取創建對應的RoutingDataSourceContext對象,傳入對應的key,后續springboot找AbstractRoutingDataSource中的數據源時,就會由傳入的key查找對應的map中的數據源。
-
測試
總結:
- 創建AbstractRoutingDataSource的子類,實現determinCurrentLookUpKey()方法
- 生成兩個數據源bean對象需要配置進該子類bean對象中,當需要獲取到數據源時,會從該對象的map中獲取數據源
- 如何動態獲取key --> 使用線程綁定的ThreadLocal,保證每次請求查找指定的數據源
原文鏈接:https://blog.csdn.net/CAUC_lin/article/details/126277220
相關推薦
- 2022-12-28 詳解Go語言strconv與其他基本數據類型轉換函數的使用_Golang
- 2022-04-12 python入門之Scrapy?shell的使用_python
- 2022-10-07 C++函數指針與指針函數有哪些關系和區別_C 語言
- 2022-04-17 python使用openpyxl讀取日期并修改excel
- 2022-04-12 ASP動態include文件_ASP基礎
- 2023-08-01 在 TypeScript 中 interface 和 type 的區別
- 2022-08-25 Redis的4種緩存模式分享_Redis
- 2022-05-10 MAC m1使用homebrew安裝redis報錯
- 最近更新
-
- 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同步修改后的遠程分支