springboot实现动态数据源
时间: 2023-10-29 13:00:56 浏览: 139
在 Spring Boot 中实现动态数据源可以通过配置多个数据源并动态切换来实现。下面是一个简单的步骤:
1. 首先,在 `application.properties` 或 `application.yml` 配置文件中定义多个数据源的相关配置,如数据库连接信息等。例如:
```yaml
spring.datasource.datasource1.url=jdbc:mysql://localhost:3306/db1
spring.datasource.datasource1.username=root
spring.datasource.datasource1.password=123456
spring.datasource.datasource2.url=jdbc:mysql://localhost:3306/db2
spring.datasource.datasource2.username=root
spring.datasource.datasource2.password=123456
```
2. 创建数据源配置类,用于动态获取数据源配置。例如:
```java
@Configuration
public class DataSourceConfig {
@ConfigurationProperties(prefix = "spring.datasource.datasource1")
@Bean(name = "datasource1")
public DataSource dataSource1() {
return DataSourceBuilder.create().build();
}
@ConfigurationProperties(prefix = "spring.datasource.datasource2")
@Bean(name = "datasource2")
public DataSource dataSource2() {
return DataSourceBuilder.create().build();
}
}
```
3. 创建动态数据源类,用于根据需要动态切换数据源。例如:
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// 通过 ThreadLocal 获取当前线程选择的数据源
return DynamicDataSourceContextHolder.getDataSourceKey();
}
}
```
4. 创建数据源上下文类,用于设置和获取当前线程选择的数据源。例如:
```java
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
public static void setDataSourceKey(String dataSourceKey) {
CONTEXT_HOLDER.set(dataSourceKey);
}
public static String getDataSourceKey() {
return CONTEXT_HOLDER.get();
}
public static void clearDataSourceKey() {
CONTEXT_HOLDER.remove();
}
}
```
5. 创建配置类,将配置好的数据源和动态数据源类注入到 Spring 容器中。例如:
```java
@Configuration
public class DynamicDataSourceConfig {
@Autowired
@Qualifier("datasource1")
private DataSource dataSource1;
@Autowired
@Qualifier("datasource2")
private DataSource dataSource2;
@Bean
public DynamicDataSource dynamicDataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("datasource1", dataSource1);
dataSourceMap.put("datasource2", dataSource2);
dynamicDataSource.setTargetDataSources(dataSourceMap);
dynamicDataSource.setDefaultTargetDataSource(dataSource1);
return dynamicDataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dynamicDataSource());
return sessionFactoryBean.getObject();
}
@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dynamicDataSource());
}
@Bean
public SqlSessionTemplate sqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(sqlSessionFactory());
}
}
```
6. 在需要使用动态数据源的地方,调用 `DynamicDataSourceContextHolder.setDataSourceKey()` 方法设置当前线程选择的数据源。例如:
```java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getAllUsers() {
DynamicDataSourceContextHolder.setDataSourceKey("datasource1");
List<User> users1 = userRepository.findAll();
DynamicDataSourceContextHolder.setDataSourceKey("datasource2");
List<User> users2 = userRepository.findAll();
// 使用完后清除当前线程选择的数据源
DynamicDataSourceContextHolder.clearDataSourceKey();
return Stream.concat(users1.stream(), users2.stream()).collect(Collectors.toList());
}
}
```
以上就是在 Spring Boot 中实现动态数据源的简单步骤。通过以上配置,可以根据需要动态切换不同的数据源。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![md](https://img-home.csdnimg.cn/images/20250102104920.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)