SpringBoot和MyBatis環(huán)境下實現(xiàn)動態(tài)數(shù)據(jù)源切換過程
使用 dynamic-datasource-spring-boot-starter 是在 Spring Boot 和 MyBatis 環(huán)境下實現(xiàn)動態(tài)數(shù)據(jù)源切換最簡單和高效的方式。
這個 Starter 極大地簡化了配置和切換邏輯,它自身集成了 AbstractRoutingDataSource 的所有邏輯。
使用dynamic-datasource-spring-boot-starter
1. 引入依賴
在您的 Maven 或 Gradle 項目中引入 Starter 依賴。
Maven:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
2. 配置文件(application.yml或application.properties)
您只需在配置文件中定義所有的數(shù)據(jù)源。Starter 會自動將它們注冊和管理起來。
它約定:
spring.datasource.dynamic.primary:指定默認使用的數(shù)據(jù)源名稱(Key)。spring.datasource.dynamic.datasource:在下面配置您的具體數(shù)據(jù)源。
application.yml 示例:
spring:
# 動態(tài)數(shù)據(jù)源配置
datasource:
dynamic:
# 默認數(shù)據(jù)源,未指定時將使用這個
primary: master
datasource:
# 主庫配置 (Key: master)
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_master?serverTimezone=Asia/Shanghai
username: root
password: 123
# 從庫配置 (Key: slave)
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_slave?serverTimezone=Asia/Shanghai
username: root
password: 123
3. 實現(xiàn)數(shù)據(jù)源動態(tài)切換
Starter 提供了 @DS 注解來實現(xiàn)數(shù)據(jù)源的動態(tài)切換。這個注解可以直接用于 Service 層的方法、Mapper 接口的方法,甚至整個 Mapper 類上。
示例 1: 在 Service 層方法上切換
這是最常見的用法,因為 Service 層更貼近業(yè)務(wù)邏輯。
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.stereotype.Service;
@Service
public class UserService {
// 默認使用 primary 配置的數(shù)據(jù)源,即 master
public User getMasterUser(Long id) {
// ... 邏輯
}
// 明確指定使用 slave 數(shù)據(jù)源,常用于查詢
@DS("slave")
public List<User> getSlaveUsers() {
// ... 邏輯,此方法執(zhí)行期間會使用 slave 庫
return userMapper.selectAll();
}
// 明確指定使用 master 數(shù)據(jù)源,常用于事務(wù)性的更新操作
@DS("master")
public void updateMasterUser(User user) {
// ... 邏輯,此方法執(zhí)行期間會使用 master 庫
userMapper.update(user);
}
}
示例 2: 在 Mapper 接口或方法上切換
您也可以直接在 Mapper 接口上指定數(shù)據(jù)源,但通常不推薦將數(shù)據(jù)源的決策放在持久層。
import com.baomidou.dynamic.datasource.annotation.DS;
import org.apache.ibatis.annotations.Mapper;
// 整個 Mapper 接口都使用 slave 數(shù)據(jù)源
@DS("slave")
@Mapper
public interface SlaveUserMapper {
List<User> selectAll();
// 如果某個方法需要覆蓋類上的配置,可以再次使用 @DS
@DS("master")
User selectById(Long id);
}
額外高級功能
dynamic-datasource-spring-boot-starter 除了基礎(chǔ)的動態(tài)切換外,還提供了一些非常實用的高級功能:
1. 讀寫分離(Load Balance)
該 Starter 原生支持基于組的負載均衡。
配置示例:
spring:
datasource:
dynamic:
primary: master-group # 默認使用 master-group
datasource:
# 定義一個名為 master-group 的組,它包含一個主庫和兩個從庫
master-group:
# 主庫
master:
url: ...
# 從庫 1
slave1:
url: ...
# 從庫 2
slave2:
url: ...
使用方式:
- 寫入操作(默認): 當您使用
@DS("master-group")進行 寫操作(UPDATE/INSERT/DELETE) 時,會自動連接到組內(nèi)的master庫。 - 讀取操作(負載均衡): 當您使用
@DS("master-group")進行 讀操作(SELECT) 時,會在slave1和slave2之間進行負載均衡(默認是輪詢)。
2. 運行時添加/刪除數(shù)據(jù)源
該 Starter 提供了 DynamicDataSourceService 接口,允許您在項目運行期間,通過代碼動態(tài)地添加或刪除數(shù)據(jù)源,這對于多租戶等場景非常有用。
@Autowired
private DynamicDataSourceCreator dynamicDataSourceCreator;
@Autowired
private DynamicDataSource dynamicDataSource;
public void addTenantDataSource(String tenantId, DataSourceProperty dp) {
// 1. 創(chuàng)建新的數(shù)據(jù)源(例如使用 Druid 或 Hikari 配置)
DataSource newDs = dynamicDataSourceCreator.createDataSource(dp);
// 2. 將數(shù)據(jù)源添加到動態(tài)數(shù)據(jù)源管理器中
dynamicDataSource.addDataSource(tenantId, newDs);
}
總之
使用 @DS 注解和簡潔的配置,dynamic-datasource-spring-boot-starter 是解決 MyBatis 動態(tài)數(shù)據(jù)源問題的最佳實踐。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SSH框架網(wǎng)上商城項目第24戰(zhàn)之Struts2中處理多個Model請求的方法
這篇文章主要為大家詳細介紹了SSH框架網(wǎng)上商城項目第24戰(zhàn)之Struts2中處理多個Model請求的方法,感興趣的小伙伴們可以參考一下2016-06-06

