springboot 配置主从数据源
时间: 2023-09-01 13:11:51 浏览: 102
在 Spring Boot 中配置主从数据源,需要使用一个名为 DynamicDataSource 的动态数据源。该动态数据源可以根据不同的数据源 key 来动态切换数据源,从而实现主从数据源的切换。
下面是配置步骤:
1. 创建 DynamicDataSource 类
```
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceKey();
}
}
```
2. 创建 DataSourceContextHolder 类
```
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceKey(String dataSourceKey) {
contextHolder.set(dataSourceKey);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
}
```
3. 配置数据源
在 application.yml 中配置主从数据源:
```
spring:
datasource:
master:
url: jdbc:mysql://localhost:3306/masterdb
username: root
password: root
slave:
url: jdbc:mysql://localhost:3306/slavedb
username: root
password: root
```
4. 配置 DynamicDataSource
```
@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();
}
@Bean
public DynamicDataSource dataSource() {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("master", masterDataSource());
targetDataSources.put("slave", slaveDataSource());
DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setTargetDataSources(targetDataSources);
dataSource.setDefaultTargetDataSource(masterDataSource());
return dataSource;
}
}
```
5. 使用数据源
在 Service 或 Dao 中使用数据源:
```
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
@DataSource(DataSourceType.SLAVE)
public List<User> listUsers() {
return userDao.listUsers();
}
@Override
@DataSource(DataSourceType.MASTER)
public int addUser(User user) {
return userDao.addUser(user);
}
}
```
在上面的示例中,我们使用 @DataSource 注解来标记使用哪个数据源。@DataSource 注解需要一个 DataSourceType 参数,可以是 MASTER 或 SLAVE。其中 MASTER 是默认数据源。
这样就可以实现主从数据源的配置了。
阅读全文