dynamic-datasource組件實現多數據源
- 一、背景介紹
- 二、 思路方案
- 三、過程
- 四、總結
- 五、升華
一、背景介紹
博主最近研發的項目中由于業務需要,在項目中使用到多個數據源。使用到了baomidou的dynamic-datasource組件來實現訪問不同的數據源。覺得挺有意思的也是進行了入門級別的研究,梳理出了dynamic-datasource組件宏觀實現邏輯。
二、 思路方案
在沒有框架之前我們訪問數據庫是創建數據庫連接然后執行操作數據庫的命令。那么如果要用到多個數據源的話就需要創建數據庫A連接和數據庫B連接,再分別用數據庫A的連接和數據庫B的連接訪問數據庫就行了。
其實baomidou 的dynamic-datasource組件實現多數據源也是差不多同一個道理。
三、過程
baomidou dynamic-datasource官方文檔
- 引入dynamic-datasource-spring-boot-starter。
<!--動態數據庫切換--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>4.1.3</version></dependency>
- 配置數據源。
spring:datasource:dynamic: #動態primary: master #設置默認的數據源或者數據源組,默認值即為masterstrict: false #嚴格匹配數據源,默認false. true未匹配到指定數據源時拋異常,false使用默認數據源datasource:master:url: jdbc:mysql://xxxxx:3306/xxx?useUnicode=true&characterEncoding=utf8username: xxxxpassword: xxxxdriver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0開始支持SPI可省略此配置slave_1:url: jdbc:mysql://xxxx:3306/xxxx?useUnicode=true&characterEncoding=utf8username: xxxpassword: xxxdriver-class-name: com.mysql.jdbc.Driver
- 使用 @DS 切換數據源。
package com.wangwei.easycodemybatisplus.dao;import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wangwei.easycodemybatisplus.entity.Actor;/*** (Actor)表數據庫訪問層** @author wangwei* @since 2024-05-21 10:34:39*/
@DS("slave_1")
public interface ActorDao extends BaseMapper<Actor> {}
package com.wangwei.easycodemybatisplus.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wangwei.easycodemybatisplus.entity.ArproUserCourseInfo;/*** 用戶課程列表(ArproUserCourseInfo)表數據庫訪問層** @author wangwei* @since 2024-05-21 09:39:06*/
public interface ArproUserCourseInfoDao extends BaseMapper<ArproUserCourseInfo> {}
當我們使用對應的Dao層接口的時候,會進行數據源的切換。
- 原理解析
5.
dynamic-datasource組件中有DynamicRoutingDataSource 類繼承自 Spring 的 AbstractRoutingDataSource,里面封裝了dataSourceMap屬性——dataSourceMap(concurrentHashMap)用戶存儲所有的數據庫映射關系,鍵為數據源名稱,值為DataSource對象(里面包含了數據庫的url,賬號,密碼等信息)。并且也封裝了操作數據源的方法。
@DS 注解:在 DAO 層或服務層的方法或類上使用 @DS 注解來指定使用哪個數據源,當一個數據源被指定使用(通過 @DS 注解),并且有數據庫操作請求時,DynamicRoutingDataSource 會從dataSourceMap 中獲取對應的 DataSource 對象,并創建數據庫連接。
四、總結
- baomidou實現多數據源的切換在使用過程中還需要注意事務的問題。
- 明白了多數據源的底層之后,也可以自己實現多數據源切換。另外多數據源方案還有Sharding-JDBC 和Spring Data JPA多數據源方案。
五、升華
- 通過這次對多數據源的原理的研究發現其實挺有意思的,并且于很早之前的沒有框架的時候實現數據庫連接串聯了起來,這樣這塊知識會比較影響深刻。