如何在springboot动态切换数据源
时间: 2024-01-27 07:04:01 浏览: 74
使用springboot + JPA / MyBatis 实现多数据源动态切换
在Spring Boot中动态切换数据源可以使用AbstractRoutingDataSource类来实现。以下是实现动态数据源切换的步骤:
1. 配置数据源:在application.properties或application.yml文件中配置多个数据源的相关信息,包括数据库连接信息、用户名、密码等。
2. 创建数据源管理器:创建一个类,继承AbstractRoutingDataSource,并重写determineCurrentLookupKey方法。该方法的作用是根据当前线程的上下文/environment等信息动态确定使用哪个数据源。
3. 配置数据源管理器:在Spring Boot的配置类中添加@Bean注解,将数据源管理器注入到Spring容器中。
4. 使用数据源:在需要切换数据源的业务类或方法中,通过Spring的注解@Qualifier注解指定数据源管理器,并调用相关的数据访问接口。
下面是一个示例代码:
1. 配置多个数据源:
```java
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().build();
}
}
```
2. 创建数据源管理器:
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceKey();
}
}
```
3. 配置数据源管理器:
```java
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dynamicDataSource(DataSource masterDataSource, DataSource slaveDataSource) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(DataSourceKey.MASTER, masterDataSource);
targetDataSources.put(DataSourceKey.SLAVE, slaveDataSource);
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
dynamicDataSource.setTargetDataSources(targetDataSources);
return dynamicDataSource;
}
}
```
4. 使用数据源:
```java
@Service
public class UserService {
@Autowired
@Qualifier("dynamicDataSource")
private DataSource dataSource;
public List<User> getUsers() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
return jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper<>(User.class));
}
public void addUser(User user) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("INSERT INTO users (id, name) VALUES (?, ?)", user.getId(), user.getName());
}
}
```
在需要切换数据源的时候,通过调用DataSourceContextHolder.setDataSourceKey方法设置当前线程使用的数据源KEY即可。例如:
```java
@GetMapping("/users")
public List<User> getUsers() {
DataSourceContextHolder.setDataSourceKey(DataSourceKey.SLAVE);
return userService.getUsers();
}
```
以上是一个简单的动态切换数据源的示例,可以根据具体需求进行扩展和优化。
阅读全文