使用 dynamic-datasource-spring-boot-starter 实现多数据源动态切换
目录
在实际开发中,我们经常会遇到需要在一个项目中连接多个数据源的场景。例如,一个应用可能需要同时访问多个数据库,或者根据业务需求动态切换数据源。dynamic-datasource-spring-boot-starter 是一个基于 Spring Boot 的轻量级多数据源动态切换工具,能够帮助我们轻松实现多数据源的管理和切换。 本文将详细介绍如何使用 dynamic-datasource-spring-boot-starter,包括使用方法、注意事项以及代码示例。
1. 引入依赖
2. 配置多数据源
3. 数据源切换
3.1 在方法级别切换数据源
3.2 在类级别切换数据源
4. 动态数据源原理
dynamic-datasource-spring-boot-starter 的核心原理是通过 AbstractRoutingDataSource 实现数据源的动态切换。它维护了一个线程本地变量(ThreadLocal),用于存储当前线程使用的数据源标识。@DS 注解会修改这个标识,从而在方法执行时切换到指定的数据源。
5. 事务管理
5.1 单数据源事务
5.2 多数据源事务
6. 高级功能
6.1 动态添加数据源
6.2 数据源健康检查
8. 总结
dynamic-datasource-spring-boot-starter 是一个功能强大且易于使用的多数据源管理工具。通过简单的配置和注解,我们可以轻松实现多数据源的动态切换和管理。本文详细介绍了其使用方法,并提供了代码示例,希望能帮助你在实际项目中更好地应用这一工具。 如果你有更多需求(如分布式事务、动态添加数据源等),可以参考官方文档或深入源码进行扩展。
在实际开发中,我们经常会遇到需要在一个项目中连接多个数据源的场景。例如,一个应用可能需要同时访问多个数据库,或者根据业务需求动态切换数据源。dynamic-datasource-spring-boot-starter
是一个基于 Spring Boot 的轻量级多数据源动态切换工具,能够帮助我们轻松实现多数据源的管理和切换。 本文将详细介绍如何使用 dynamic-datasource-spring-boot-starter
,包括使用方法、注意事项以及代码示例。
1. 引入依赖
首先,在 pom.xml
中引入 dynamic-datasource-spring-boot-starter
依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.1</version> //选择合适的版本
</dependency>
2. 配置多数据源
在 application.yml
中配置多个数据源。以下是一个示例配置:
spring:
datasource:
dynamic:
primary: master # 默认数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/master_db?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://localhost:3306/slave_db?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
primary
:指定默认数据源。datasource
:定义多个数据源,每个数据源需要配置url
、username
、password
和driver-class-name
。
3. 数据源切换
dynamic-datasource-spring-boot-starter
提供了 @DS
注解,用于在方法或类级别动态切换数据源。
3.1 在方法级别切换数据源
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@DS("master") // 使用 master 数据源
public void addUser(User user) {
// 插入用户数据
}
@DS("slave") // 使用 slave 数据源
public User getUserById(Long id) {
// 查询用户数据
return userMapper.selectById(id);
}
}
3.2 在类级别切换数据源
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.stereotype.Service;
@Service
@DS("slave") // 类级别指定默认数据源为 slave
public class OrderService {
public Order getOrderById(Long id) {
// 查询订单数据
return orderMapper.selectById(id);
}
@DS("master") // 方法级别覆盖类级别的数据源
public void addOrder(Order order) {
// 插入订单数据
}
}
4. 动态数据源原理
dynamic-datasource-spring-boot-starter
的核心原理是通过 AbstractRoutingDataSource
实现数据源的动态切换。它维护了一个线程本地变量(ThreadLocal
),用于存储当前线程使用的数据源标识。@DS
注解会修改这个标识,从而在方法执行时切换到指定的数据源。
5. 事务管理
在多数据源场景下,事务管理需要特别注意。默认情况下,Spring 的事务管理器只能管理一个数据源。如果需要跨数据源事务,可以使用分布式事务解决方案(如 Seata)。
5.1 单数据源事务
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Transactional // 默认使用主数据源
public void addUser(User user) {
userMapper.insert(user);
}
}
5.2 多数据源事务
如果需要跨数据源事务,可以使用 @DSTransactional
注解:
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import org.springframework.stereotype.Service;
@Service
public class OrderService {
@DSTransactional // 支持多数据源事务
public void placeOrder(Order order, User user) {
userMapper.insert(user); // 使用 master 数据源
orderMapper.insert(order); // 使用 slave 数据源
}
}
6. 高级功能
6.1 动态添加数据源
在某些场景下,可能需要动态添加数据源。可以通过 DynamicDataSourceCreator
实现:
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DataSourceService {
@Autowired
private DynamicDataSourceCreator dataSourceCreator;
public void addDataSource(String name, String url, String username, String password) {
DataSourceProperty property = new DataSourceProperty();
property.setUrl(url);
property.setUsername(username);
property.setPassword(password);
property.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSourceCreator.createDataSource(property, name);
}
}
6.2 数据源健康检查
可以通过 DataSourceHealthIndicator
检查数据源的健康状态:
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceHealthIndicator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HealthCheckService {
@Autowired
private DataSourceHealthIndicator healthIndicator;
public boolean checkDataSourceHealth(String name) {
return healthIndicator.health(name).getStatus().isUp();
}
}
8. 总结
dynamic-datasource-spring-boot-starter
是一个功能强大且易于使用的多数据源管理工具。通过简单的配置和注解,我们可以轻松实现多数据源的动态切换和管理。本文详细介绍了其使用方法,并提供了代码示例,希望能帮助你在实际项目中更好地应用这一工具。 如果你有更多需求(如分布式事务、动态添加数据源等),可以参考官方文档或深入源码进行扩展。
参考文档:
- dynamic-datasource-spring-boot-starter GitHub
- Spring Boot 官方文档
- MyBatis 官方文档