日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

springboot實現動態數據源切換

作者:CAUC_lin 更新時間: 2022-08-15 編程語言

springboot實現動態數據源切換

為什么需要切換數據源?

當數據量超過500萬行時,數據庫就要考慮分庫分表和讀寫分離,有些業務背景需要動態切換數據庫。
當controller層處理請求,需要在dao層代碼執行之前能夠將數據源換成我們想要執行操作的數據源。

底層原理

Springboot內置了一個AbstractRoutingDataSource,將所有數據源裝入map,然后可以根據不同的key返回不同的數據源。當springboot開始執行連接數據庫之前會執行determineCurrentLookupKey()方法,這個方法返回的數據將作為key去map中查找相應的數據源。

需求

根據不同的請求實現動態切換,查詢不同的數據庫。

實現步驟

  1. 創建springboot工程,準備 數據庫 和 web相關的依賴
    在這里插入圖片描述

  2. 準備兩個數據庫的表,在項目中創建對應的pojo實體類
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

  3. 分別創建兩個數據庫對應的dao層、service層和controller層,核心啟動類上需要添加包掃描MapperScan
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

  4. 準備相關的數據源配置信息,在application.properties文件中設置
    在這里插入圖片描述

  5. 創建數據源自動配置類,當容器啟動時,創建對應的數據源bean對象
    在這里插入圖片描述

  6. 創建AbstractRoutingDataSource的子類,當springboot想要獲取數據源對象時,會執行determinCurrentLookUpKey()方法,獲取想要的數據源,所以需要重寫這個方法
    在這里插入圖片描述
    先將返回值寫成固定字符串,后續實現動態獲取key,再進行修改。

  7. 在數據源自動配置類中添加AbstractRoutingDataSource子類bean的注入,當AbstractRoutingDataSource想要獲取數據源時,會從它的成員變量中存的數據源的map集合中獲取,所以需要給它注入包含兩個數據源的map集合
    在這里插入圖片描述

  8. 在核心啟動類上需要添加@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class} ),排除默認的數據源
    在這里插入圖片描述

  9. 如何實現動態獲取key?
    每一個請求是一個單獨的線程,將key存入當前線程的ThreadLocal里面。創建新的對象RoutingDataSourceContext,存在唯一的ThreadLocal對象,在構造函數中傳入key,另外創建獲取方法和關閉方法。
    在這里插入圖片描述

  10. 在重寫的determinCurrentLookUpKey()方法中調用RoutingDataSourceContext動態獲取key的方法
    在這里插入圖片描述11. 在controller層發起請求時獲取創建對應的RoutingDataSourceContext對象,傳入對應的key,后續springboot找AbstractRoutingDataSource中的數據源時,就會由傳入的key查找對應的map中的數據源。
    在這里插入圖片描述

  11. 測試
    在這里插入圖片描述
    在這里插入圖片描述
    總結:

  • 創建AbstractRoutingDataSource的子類,實現determinCurrentLookUpKey()方法
  • 生成兩個數據源bean對象需要配置進該子類bean對象中,當需要獲取到數據源時,會從該對象的map中獲取數據源
  • 如何動態獲取key --> 使用線程綁定的ThreadLocal,保證每次請求查找指定的數據源

原文鏈接:https://blog.csdn.net/CAUC_lin/article/details/126277220

欄目分類
最近更新