springboot动态数据源示例
时间: 2023-09-11 09:04:23 浏览: 110
springboot mybatis使用动态数据源的例子
Spring Boot 支持多数据源配置,可以通过动态数据源实现在运行时动态切换数据源。下面是一个示例:
首先在 pom.xml 中添加如下依赖:
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
```
接着在 application.properties 中配置数据源:
```properties
spring.datasource.dynamic.primary=master
spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=root
spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.dynamic.datasource.slave.username=root
spring.datasource.dynamic.datasource.slave.password=root
```
接着我们需要实现动态数据源:
```java
@Configuration
public class DynamicDataSourceConfig {
// 配置主从数据源
@Bean
@ConfigurationProperties("spring.datasource.dynamic.datasource.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.dynamic.datasource.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
// 配置动态数据源
@Primary
@Bean
public DataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("master", masterDataSource);
targetDataSources.put("slave", slaveDataSource);
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setTargetDataSources(targetDataSources);
dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
return dynamicDataSource;
}
}
```
接着我们需要创建一个动态数据源类:
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSource();
}
}
```
在上面的代码中,我们通过 `determineCurrentLookupKey()` 方法来获取当前使用的数据源的 key,这里使用了一个 `DataSourceContextHolder` 类来保存当前线程使用的数据源的 key。
最后我们需要实现一个 `DataSourceContextHolder` 类来保存当前线程使用的数据源的 key:
```java
public class DataSourceContextHolder {
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
CONTEXT_HOLDER.set(dataSource);
}
public static String getDataSource() {
return CONTEXT_HOLDER.get();
}
public static void clearDataSource() {
CONTEXT_HOLDER.remove();
}
}
```
现在我们就可以在需要使用不同数据源的地方设置数据源的 key,例如:
```java
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> getUsers() {
DataSourceContextHolder.setDataSource("slave");
List<User> users = userService.getUsers();
DataSourceContextHolder.clearDataSource();
return users;
}
}
```
在上面的代码中,我们通过 `DataSourceContextHolder.setDataSource("slave")` 方法来设置当前线程使用的数据源为从数据源,调用完毕后,需要调用 `DataSourceContextHolder.clearDataSource()` 方法来清除当前线程使用的数据源的 key。
这样就可以实现在运行时动态切换数据源了。
阅读全文