🚀 作者主頁: 有來技術
🔥 開源項目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot
🌺 倉庫主頁: Gitee 💫 Github 💫 GitCode
💖 歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請糾正!
目錄
- 前言
- Spring Boot 整合動態數據源
- Maven 依賴
- 動態數據源配置
- 動態切換數據源實戰
- 注解切換數據源
- 手動切換數據源
- 動態數據源原理
- 結語
- 開源項目
前言
處理多數據庫場景是一項常見的任務。本文將介紹如何使用 dynamic-datasource-spring-boot-starter
啟動器,以簡化 Spring Boot 項目中的多數據源集成。
Spring Boot 整合動態數據源
參考 dynamic-datasource
官網:https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
Maven 依賴
pom.xml 添加依賴坐標,Spring Boot 3 區別其他版本,使用的是 dynamic-datasource-spring-boot3-starter
, 其他版本的 Spring Boot
使用 dynamic-datasource-spring-boot-starter
, 除了依賴區別,其他配置和使用方式新老版本無差別。
-
Spring Boot 3
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot3-starter</artifactId><version>4.2.0</version> </dependency>
-
Spring 1.5.x Spring 2.x.x
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>4.2.0</version> </dependency>
動態數據源配置
spring:datasource:dynamic:primary: master #設置默認的數據源或者數據源組,默認值即為 masterstrict: false # 設置嚴格模式,當數據源找不到時,是否拋出異常,默認為false不拋出datasource:master: # 主庫type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0開始支持SPI可省略此配置url: jdbc:mysql://www.youlai.tech:3306/youlai_boot?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=trueusername: youlaipassword: 123456slave: # 從庫type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/youlai_boot?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=trueusername: rootpassword: 123456
動態切換數據源實戰
注解切換數據源
@DS 可以注解在方法上或類上,同時存在就近原則 方法上注解 優先于 類上注解。
注解 | 結果 |
---|---|
沒有@DS | 默認數據源 |
@DS(“dsName”) | dsName可以為組名也可以為具體某個庫的名稱 |
/*** 主庫查詢*/
@DS("master")
@Select("select * from sys_user where id = #{userId}")
SysUser getUserFromMaster(Long userId);/*** 從庫查詢*/
@DS("slave")
@Select("select * from sys_user where id = #{userId}")
SysUser getUserFromSlave(Long userId);
單元測試類
package com.youlai.system.mapper;import com.youlai.system.model.entity.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
@Slf4j
class SysUserMapperTest {@Autowiredprivate SysUserMapper userMapper;private final Long userId = 1L;/*** 測試注解方式切換數據源*/@Testvoid testSwitchDataSourceByAnnotation() {SysUser masterUser = userMapper.getUserFromMaster(userId);log.info("用戶ID:{} 主庫姓名:{}", userId, masterUser.getNickname());SysUser slaveUser = userMapper.getUserFromSlave(userId);log.info("用戶ID:{} 從庫姓名:{}", userId, slaveUser.getNickname());}
}
測試結果
手動切換數據源
有些場景沒法使用注解去切換,舉個例子,同一個方法內使用 Mybatis-Plus
提供的方法先后分別從主庫和從庫各查一次。
這時候簡單的切換數據源就是使用 DynamicDataSourceContextHolder
的 push 方法動態設置數據源上下文,完成了使用特定數據源的數據庫操作后,再調用 poll
方法,以便將數據源上下文清空,避免影響后續的數據庫操作。
/*** 測試手動方式切換數據源*/@Testvoid testDataSourceSwitchManually() {DynamicDataSourceContextHolder.push("master");SysUser masterUser = userMapper.selectById(userId);log.info("手動切換:主庫姓名:{}", masterUser.getNickname());DynamicDataSourceContextHolder.poll();DynamicDataSourceContextHolder.push("slave");SysUser slaveUser = userMapper.selectById(userId);log.info("手動切換:從庫姓名:{}", slaveUser.getNickname());DynamicDataSourceContextHolder.poll();}
測試結果
動態數據源原理
源碼圖如下,原理會在下一篇【原理篇】詳細講解。
結語
通過 dynamic-datasource-spring-boot-starter
這個啟動器,我們輕松實現了在 Spring Boot 項目中集成多數據源的功能。無論是注解方式還是手動方式切換數據源,都使得處理多數據庫場景變得更加簡便和靈活。
在注解方式中,通過 @DS
注解,我們可以輕松切換數據源,實現了一定的自動化。而在手動方式中,使用 DynamicDataSourceContextHolder
的 push
和 poll
方法,我們可以更加靈活地控制數據源的切換,適用于一些特殊場景。
在下一篇文章中,我們將深入探討 dynamic-datasource
的原理,了解其如何實現動態數據源切換,同時也會對 MyBatis 的源碼進行一些了解。這將有助于更好地理解多數據源切換的底層機制。
開源項目
- SpringCloud + Vue3 微服務商城
Github | Gitee | |
---|---|---|
后端 | youlai-mall 🍃 | youlai-mall 🍃 |
前端 | mall-admin🌺 | mall-admin 🌺 |
移動端 | mall-app 🍌 | mall-app 🍌 |
- SpringBoot 3+ Vue3 單體權限管理系統
Github | Gitee | |
---|---|---|
后端 | youlai-boot 🍃 | youlai-boot 🍃 |
前端 | vue3-element-admin 🌺 | vue3-element-admin 🌺 |