druid多数据源配置springboot(springboot多数据源原理)

# 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 targetDataSources = new HashMap<>();targetDataSources.put("master", masterDataSource);targetDataSources.put("slave", slaveDataSource);AbstractRoutingDataSource abstractRoutingDataSource = new DynamicDataSource();abstractRoutingDataSource.setDefaultTargetDataSource(masterDataSource);abstractRoutingDataSource.setTargetDataSources(targetDataSources);abstractRoutingDataSource.afterPropertiesSet();return abstractRoutingDataSource;} } ```### 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 应用中灵活切换数据源。

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 targetDataSources = new HashMap<>();targetDataSources.put("master", masterDataSource);targetDataSources.put("slave", slaveDataSource);AbstractRoutingDataSource abstractRoutingDataSource = new DynamicDataSource();abstractRoutingDataSource.setDefaultTargetDataSource(masterDataSource);abstractRoutingDataSource.setTargetDataSources(targetDataSources);abstractRoutingDataSource.afterPropertiesSet();return abstractRoutingDataSource;} } ```

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 应用中灵活切换数据源。

Powered By Z-BlogPHP 1.7.2

备案号:蜀ICP备2023005218号