Springboot 整合mongo 多数据源动态切换
时间: 2023-12-14 10:36:51 浏览: 166
在 Spring Boot 中整合 MongoDB 多数据源,需要按照以下步骤操作:
1. 引入 MongoDB 的依赖
在 pom.xml 文件中引入 MongoDB 的依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
```
2. 配置数据源
在 application.properties 文件中配置多个数据源:
```properties
# 数据源1
spring.data.mongodb.uri=mongodb://localhost:27017/db1
# 数据源2
mongodb2.uri=mongodb://localhost:27017/db2
```
3. 配置多数据源
创建多个数据源的配置类,继承自 `AbstractMongoConfiguration`,并重写 `mongoClient()` 方法:
```java
@Configuration
public class DataSourceConfig1 extends AbstractMongoConfiguration {
@Value("${spring.data.mongodb.uri}")
private String uri;
@Override
protected String getDatabaseName() {
return "db1";
}
@Override
public MongoClient mongoClient() {
return new MongoClient(new MongoClientURI(uri));
}
}
@Configuration
public class DataSourceConfig2 extends AbstractMongoConfiguration {
@Value("${mongodb2.uri}")
private String uri;
@Override
protected String getDatabaseName() {
return "db2";
}
@Override
public MongoClient mongoClient() {
return new MongoClient(new MongoClientURI(uri));
}
}
```
4. 配置动态数据源
创建一个动态数据源,实现 `AbstractRoutingDataSource` 接口,重写 `determineCurrentLookupKey()` 方法:
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSource();
}
}
```
5. 配置数据源上下文
创建一个数据源上下文,用于保存当前使用的数据源的名称:
```java
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
contextHolder.set(dataSource);
}
public static String getDataSource() {
return contextHolder.get();
}
public static void clearDataSource() {
contextHolder.remove();
}
}
```
6. 配置事务管理器
创建一个事务管理器,用于管理多个数据源的事务:
```java
@Configuration
@EnableTransactionManagement
public class TransactionConfig implements TransactionManagementConfigurer {
@Autowired
private DynamicDataSource dynamicDataSource;
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dynamicDataSource);
}
}
```
7. 完成动态数据源配置
在 `Application` 类中完成动态数据源的配置:
```java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public DynamicDataSource dynamicDataSource(DataSourceConfig1 dataSourceConfig1, DataSourceConfig2 dataSourceConfig2) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("db1", dataSourceConfig1.mongoClient());
targetDataSources.put("db2", dataSourceConfig2.mongoClient());
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setDefaultTargetDataSource(dataSourceConfig1.mongoClient());
dynamicDataSource.setTargetDataSources(targetDataSources);
return dynamicDataSource;
}
@Bean
public MongoClient mongoClient(DynamicDataSource dynamicDataSource) {
return dynamicDataSource;
}
@Bean
public MongoTemplate mongoTemplate(DynamicDataSource dynamicDataSource) {
return new MongoTemplate(dynamicDataSource);
}
}
```
至此,就完成了 Spring Boot 整合 MongoDB 多数据源动态切换的配置。在需要切换数据源的地方,可以使用 `DataSourceContextHolder.setDataSource("db1")` 进行动态切换。
阅读全文