網站首頁 編程語言 正文
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
相關推薦
- 2023-01-12 Redis中Bloom?filter布隆過濾器的學習_Redis
- 2022-12-09 react?hooks?UI與業務邏輯分離必要性技術方案_React
- 2022-05-27 hive中的幾種join到底有什么區別_數據庫其它
- 2022-06-09 ASP.NET?Core中的Configuration配置二_基礎應用
- 2022-12-07 C++小游戲教程之猜數游戲的實現_C 語言
- 2022-06-16 C#使用符號表實現查找算法_C#教程
- 2021-04-13 手動清理 Memcached 緩存的方法
- 2023-10-25 el-tree設置選中高亮/焦點高亮、選中的節點加深背景,更改字體顏色等
- 最近更新
-
- 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同步修改后的遠程分支