springboot双数据源,mysql无法切换到oracle
时间: 2023-09-10 19:15:44 浏览: 114
在SpringBoot中实现双数据源,需要使用到多个数据源的配置,以及动态切换数据源的代码。
在配置多个数据源时,需要在application.properties或application.yml文件中分别配置不同的数据源信息,包括数据源的驱动、url、用户名、密码等信息。例如:
```
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.primary.url=jdbc:mysql://localhost:3306/db1
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.secondary.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.secondary.url=jdbc:oracle:thin:@localhost:1521:db2
spring.datasource.secondary.username=oracle
spring.datasource.secondary.password=oracle
```
在代码中,需要定义两个数据源的bean,并且使用@Primary注解标记其中一个数据源为主数据源。例如:
```
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
```
在使用数据源的时候,需要使用@Qualifier注解指定要使用的数据源。例如:
```
@Service
public class UserService {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
public void addUser(User user) {
// 使用主数据源插入用户信息
// ...
}
public User getUser(Long id) {
// 使用从数据源查询用户信息
// ...
}
}
```
在动态切换数据源时,可以使用ThreadLocal来保存当前线程使用的数据源。例如:
```
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
contextHolder.set(dataSource);
}
public static String getDataSource() {
return contextHolder.get();
}
public static void clearDataSource() {
contextHolder.remove();
}
}
```
在使用数据源之前,需要先调用DynamicDataSourceContextHolder.setDataSource(dataSource)方法来设置当前线程使用的数据源。例如:
```
@Service
public class UserService {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
public void addUser(User user) {
DynamicDataSourceContextHolder.setDataSource("primaryDataSource");
// 使用主数据源插入用户信息
// ...
}
public User getUser(Long id) {
DynamicDataSourceContextHolder.setDataSource("secondaryDataSource");
// 使用从数据源查询用户信息
// ...
}
}
```
注意:在使用完数据源之后,需要调用DynamicDataSourceContextHolder.clearDataSource()方法清除当前线程使用的数据源,以免影响下一次使用数据源。
阅读全文