ruoyi多数据源配置及使用
时间: 2023-09-16 20:13:42 浏览: 302
数据源配置
Ruoyi框架中多数据源配置和使用非常简单,下面是具体步骤:
1. 在 `application.yml` 中配置多个数据源信息,例如:
```
spring:
datasource:
# 主数据源配置
master:
url: jdbc:mysql://localhost:3306/db1
username: root
password: root
# 第二个数据源配置
slave:
url: jdbc:mysql://localhost:3306/db2
username: root
password: root
```
这里配置了两个数据源,一个是主数据源,另一个是名为 `slave` 的数据源。
2. 在 `DataSourceConfig` 类中配置多数据源,例如:
```java
@Configuration
public class DataSourceConfig {
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "dynamicDataSource")
@Primary
public DataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) {
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>(2);
dataSourceMap.put(DataSourceType.MASTER.name(), masterDataSource);
dataSourceMap.put(DataSourceType.SLAVE.name(), slaveDataSource);
dynamicRoutingDataSource.setDefaultTargetDataSource(masterDataSource);
dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
DynamicDataSourceContextHolder.dataSourceKeys.addAll(dataSourceMap.keySet());
return dynamicRoutingDataSource;
}
}
```
在这里,我们定义了两个 `@Bean`,分别对应 `master` 和 `slave` 数据源,并且定义了一个 `DynamicRoutingDataSource` 对象,它是一个动态数据源,可以根据需要切换到不同的数据源。在 `dynamicDataSource` 方法中,我们将两个数据源添加到 `dataSourceMap` 中,并设置 `masterDataSource` 为默认的数据源。
3. 定义一个枚举类 `DataSourceType`,用于定义数据源的类型,例如:
```java
public enum DataSourceType {
MASTER,
SLAVE
}
```
4. 定义一个 `DynamicDataSourceContextHolder` 类,用于动态切换数据源,例如:
```java
public class DynamicDataSourceContextHolder {
public static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static Set<Object> dataSourceKeys = new HashSet<>();
public static void setDataSourceKey(String dataSourceKey) {
contextHolder.set(dataSourceKey);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
public static boolean containsDataSource(String dataSourceKey) {
return dataSourceKeys.contains(dataSourceKey);
}
}
```
`DynamicDataSourceContextHolder` 中使用了 `ThreadLocal` 来保存当前线程使用的数据源,可以在需要切换数据源的地方调用 `DynamicDataSourceContextHolder.setDataSourceKey(dataSourceKey)` 来切换数据源。另外,它还提供了 `dataSourceKeys` 属性,用于保存所有数据源的名称,方便进行判断和管理。
5. 在需要使用数据源的地方调用 `DynamicDataSourceContextHolder.setDataSourceKey(dataSourceKey)` 来切换数据源,例如:
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsers() {
DynamicDataSourceContextHolder.setDataSourceKey(DataSourceType.SLAVE.name());
List<User> userList = userMapper.selectUserList(new User());
DynamicDataSourceContextHolder.clearDataSourceKey();
return userList;
}
}
```
在这里,我们在调用 `userMapper.selectUserList` 之前,切换到 `SLAVE` 数据源,然后在查询完成之后,清除数据源的上下文。
这样,我们就可以在 Ruoyi 框架中配置和使用多个数据源了。
阅读全文