# Druid多数据源配置SpringBoot## 简介在现代企业级应用开发中,单个数据库已经无法满足复杂业务需求。为了提高系统的可扩展性和性能,通常会采用多数据源的架构设计。Druid 是阿里巴巴开源的一款高性能数据库连接池,它不仅提供了强大的监控功能,还支持多数据源的灵活配置。本文将详细介绍如何在 Spring Boot 项目中使用 Druid 实现多数据源配置。---## 多级标题1. 配置依赖
2. 数据源配置类
3. 配置多数据源
4. 动态切换数据源
5. 测试与验证---## 内容详细说明### 1. 配置依赖首先,在项目的 `pom.xml` 文件中添加必要的依赖项。包括 Spring Boot 的 Starter 和 Druid 的相关依赖:```xml
org.springframework.bootspring-boot-starter-webcom.alibabadruid-spring-boot-starter1.2.8mysqlmysql-connector-javaruntime
```### 2. 数据源配置类创建两个数据源配置类,分别用于配置不同的数据库连接信息。例如,我们可以定义一个主数据源(Master)和一个从数据源(Slave)。#### Master 数据源配置```java
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MasterDataSourceConfig {@Bean(name = "masterDataSource")public DataSource masterDataSource() {return DruidDataSourceBuilder.create().url("jdbc:mysql://localhost:3306/master_db").username("root").password("password").driverClassName("com.mysql.cj.jdbc.Driver").build();}
}
```#### Slave 数据源配置```java
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SlaveDataSourceConfig {@Bean(name = "slaveDataSource")public DataSource slaveDataSource() {return DruidDataSourceBuilder.create().url("jdbc:mysql://localhost:3306/slave_db").username("root").password("password").driverClassName("com.mysql.cj.jdbc.Driver").build();}
}
```### 3. 配置多数据源接下来,我们需要配置一个主数据源和一个从数据源,并通过 `AbstractRoutingDataSource` 来实现动态数据源切换。#### 动态数据源切换类```java
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSourceType();}
}
```#### 数据源上下文持有者```java
public class DataSourceContextHolder {private static final ThreadLocal contextHolder = new ThreadLocal<>();public static void setDataSourceType(String dataSourceType) {contextHolder.set(dataSourceType);}public static String getDataSourceType() {return contextHolder.get();}public static void clearDataSourceType() {contextHolder.remove();}
}
```#### 配置多数据源```java
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;@Configuration
public class MultiDataSourceConfig {@Bean(name = "multiDataSource")public AbstractRoutingDataSource multiDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,@Qualifier("slaveDataSource") DataSource slaveDataSource) {Map
Druid多数据源配置SpringBoot
简介在现代企业级应用开发中,单个数据库已经无法满足复杂业务需求。为了提高系统的可扩展性和性能,通常会采用多数据源的架构设计。Druid 是阿里巴巴开源的一款高性能数据库连接池,它不仅提供了强大的监控功能,还支持多数据源的灵活配置。本文将详细介绍如何在 Spring Boot 项目中使用 Druid 实现多数据源配置。---
多级标题1. 配置依赖
2. 数据源配置类
3. 配置多数据源
4. 动态切换数据源
5. 测试与验证---
内容详细说明
1. 配置依赖首先,在项目的 `pom.xml` 文件中添加必要的依赖项。包括 Spring Boot 的 Starter 和 Druid 的相关依赖:```xml
org.springframework.bootspring-boot-starter-webcom.alibabadruid-spring-boot-starter1.2.8mysqlmysql-connector-javaruntime
```
2. 数据源配置类创建两个数据源配置类,分别用于配置不同的数据库连接信息。例如,我们可以定义一个主数据源(Master)和一个从数据源(Slave)。
Master 数据源配置```java
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MasterDataSourceConfig {@Bean(name = "masterDataSource")public DataSource masterDataSource() {return DruidDataSourceBuilder.create().url("jdbc:mysql://localhost:3306/master_db").username("root").password("password").driverClassName("com.mysql.cj.jdbc.Driver").build();}
}
```
Slave 数据源配置```java
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SlaveDataSourceConfig {@Bean(name = "slaveDataSource")public DataSource slaveDataSource() {return DruidDataSourceBuilder.create().url("jdbc:mysql://localhost:3306/slave_db").username("root").password("password").driverClassName("com.mysql.cj.jdbc.Driver").build();}
}
```
3. 配置多数据源接下来,我们需要配置一个主数据源和一个从数据源,并通过 `AbstractRoutingDataSource` 来实现动态数据源切换。
动态数据源切换类```java
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSourceType();}
}
```
数据源上下文持有者```java
public class DataSourceContextHolder {private static final ThreadLocal contextHolder = new ThreadLocal<>();public static void setDataSourceType(String dataSourceType) {contextHolder.set(dataSourceType);}public static String getDataSourceType() {return contextHolder.get();}public static void clearDataSourceType() {contextHolder.remove();}
}
```
配置多数据源```java
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;@Configuration
public class MultiDataSourceConfig {@Bean(name = "multiDataSource")public AbstractRoutingDataSource multiDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,@Qualifier("slaveDataSource") DataSource slaveDataSource) {Map
4. 动态切换数据源为了实现动态切换数据源,可以在需要的地方手动设置当前线程的数据源类型。```java
import org.springframework.stereotype.Service;@Service
public class UserService {public void queryFromMaster() {DataSourceContextHolder.setDataSourceType("master");// 查询逻辑DataSourceContextHolder.clearDataSourceType();}public void queryFromSlave() {DataSourceContextHolder.setDataSourceType("slave");// 查询逻辑DataSourceContextHolder.clearDataSourceType();}
}
```
5. 测试与验证最后,编写单元测试来验证多数据源配置是否正确。```java
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class MultiDataSourceApplicationTests {@Autowiredprivate UserService userService;@Testvoid contextLoads() {userService.queryFromMaster();userService.queryFromSlave();}
}
```通过以上步骤,我们成功实现了基于 Druid 的多数据源配置,并能够在 Spring Boot 应用中灵活切换数据源。