springboot配置多数据源@DS
时间: 2023-06-28 18:11:12 浏览: 260
在Spring Boot中,我们可以使用多个数据源,但是默认情况下只能使用一个数据源。如果我们想要使用多个数据源,我们可以使用Dynamic DataSource Routing(动态数据源路由)来解决这个问题。Dynamic DataSource Routing可以根据当前线程的上下文信息来动态地切换数据源。
在使用Dynamic DataSource Routing之前,我们需要使用Spring Boot的AOP功能来拦截MyBatis的Mapper接口,并根据当前线程的上下文信息来动态地切换数据源。具体步骤如下:
1.添加依赖
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${dynamic.datasource.version}</version>
</dependency>
```
2.配置数据源
```yaml
spring:
datasource:
master:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
slave1:
url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
```
3.配置动态数据源
```java
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave1")
public DataSource slave1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public DynamicDataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slave1DataSource") DataSource slave1DataSource) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
targetDataSources.put(DataSourceType.SLAVE1.name(), slave1DataSource);
return new DynamicDataSource(masterDataSource, targetDataSources);
}
}
```
4.配置AOP
```java
@Aspect
@Component
public class DataSourceAspect {
@Pointcut("@annotation(com.baomidou.dynamic.datasource.annotation.DS)")
public void dsPointCut() {
}
@Before("dsPointCut()")
public void beforeSwitchDS(JoinPoint point) {
MethodSignature signature = (MethodSignature) point.getSignature();
DS annotation = signature.getMethod().getAnnotation(DS.class);
if (annotation == null) {
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER);
} else {
DynamicDataSourceContextHolder.setDataSourceType(annotation.value());
}
}
@After("dsPointCut()")
public void afterSwitchDS(JoinPoint point) {
DynamicDataSourceContextHolder.clearDataSourceType();
}
}
```
5.使用@DS注解来动态指定数据源
```java
@DS("slave1")
public interface UserMapper {
List<User> findAll();
}
```
以上就是在Spring Boot中配置多数据源的方法,通过Dynamic DataSource Routing来实现动态切换数据源。
阅读全文