在Spring Boot中实现多数据源连接与切换的策略
在Spring Boot中实现多数据源连接与切换,通常需要配置多个数据源并使用一些策略来决定在特定情况下使用哪个数据源。以下是实现多数据源连接与切换的步骤:
1. 添加依赖
确保在pom.xml
中添加了Spring Boot和数据库相关的依赖,如Spring Data JPA或JDBC,以及数据库驱动。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
2. 配置数据源
在application.properties
或application.yml
中配置多个数据源。
# datasource 1
spring.datasource.primary.url=jdbc:mysql://localhost:3306/db1
spring.datasource.primary.username=root
spring.datasource.primary.password=secret
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
# datasource 2
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/db2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=secret
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
3. 定义数据源配置
创建一个Java配置类来定义和管理多个数据源。
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Primary
public DataSource primaryDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/db1")
.username("root")
.password("secret")
.driverClassName("com.mysql.cj.jdbc.Driver")
.build();
}
@Bean(name = "secondaryDataSource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/db2")
.username("root")
.password("secret")
.driverClassName("com.mysql.cj.jdbc.Driver")
.build();
}
@Bean
public DataSource routingDataSource(@Qualifier("primaryDataSource") DataSource primaryDataSource,
@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
AbstractRoutingDataSource routingDataSource = new MyRoutingDataSource();
Map<Object, Object> dataSources = new HashMap<>();
dataSources.put("primary", primaryDataSource);
dataSources.put("secondary", secondaryDataSource);
routingDataSource.setTargetDataSources(dataSources);
routingDataSource.setDefaultTargetDataSource(primaryDataSource);
return routingDataSource;
}
}
4. 实现RoutingDataSource
您需要实现一个AbstractRoutingDataSource类,它根据一些上下文选择适当的数据源。
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class MyRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// 您可以在此处定义策略来选择数据源
// 例如根据某些条件返回 "primary" 或 "secondary"
String dataSourceKey = DataSourceContextHolder.getDataSourceKey();
return dataSourceKey;
}
}
5. 上下文管理
创建一个上下文管理类来设置当前的数据源。
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceKey(String key) {
contextHolder.set(key);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
}
6. 使用数据源
在服务或DAO层,可以根据业务逻辑动态切换数据源:
public void someServiceMethod() {
try {
DataSourceContextHolder.setDataSourceKey("secondary");
// 执行需要与 second 数据库交互的操作
} finally {
DataSourceContextHolder.clearDataSourceKey();
}
}
这样,您就可以在Spring Boot中灵活地实现多数据源的连接与切换策略。可以根据业务需要自定义数据源切换的条件和策略。