springboot配置双数据源application.yml怎么配置
时间: 2023-07-28 20:15:24 浏览: 162
在 Spring Boot 中配置多数据源需要用到 Spring Data JPA 的 AbstractRoutingDataSource 类,该类继承了 Spring 的 AbstractDataSource 类,可以实现动态数据源的切换。
在 application.yml 中配置多数据源,示例代码如下:
```yaml
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/db1
username: user1
password: pwd1
driver-class-name: com.mysql.jdbc.Driver
secondary:
url: jdbc:mysql://localhost:3306/db2
username: user2
password: pwd2
driver-class-name: com.mysql.jdbc.Driver
```
上述代码中,我们定义了两个数据源,一个是 primary,一个是 secondary。
接下来,在 Spring Boot 中创建动态数据源的配置类,示例代码如下:
```java
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@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();
}
@Bean(name = "dynamicDataSource")
public AbstractRoutingDataSource dynamicDataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put("primaryDataSource", primaryDataSource());
dataSourceMap.put("secondaryDataSource", secondaryDataSource());
// 设置默认数据源为 primaryDataSource
dynamicDataSource.setDefaultTargetDataSource(primaryDataSource());
dynamicDataSource.setTargetDataSources(dataSourceMap);
return dynamicDataSource;
}
}
```
在以上代码中,我们创建了两个数据源 primaryDataSource 和 secondaryDataSource,同时创建了一个动态数据源 dynamicDataSource,该数据源根据不同的线程动态切换数据源。
最后,我们需要在 JPA 的配置文件中指定数据源,示例代码如下:
```java
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager",
basePackages = {"com.example.demo.repository"}) // 指定 repository 的位置
public class JpaConfig {
@Autowired
@Qualifier("dynamicDataSource")
private DataSource dynamicDataSource;
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(dynamicDataSource)
.packages("com.example.demo.entity") // 指定 Entity 的位置
.persistenceUnit("persistenceUnit")
.build();
}
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
```
在以上代码中,我们指定了 JPA 的实体类位置和 repository 的位置,并且指定了数据源为 dynamicDataSource。
至此,我们就完成了 Spring Boot 中配置多数据源的整个过程。
阅读全文