前言
在上篇文章講到了如何配置單資料來源,但是在實際場景中,會有需要配置多個資料來源的場景,比如說,我們在支付系統中,單筆操作(包含查詢、插入、新增)中需要操作主庫,在批量查詢或者對賬單查詢等對實時性要求不高的場景,需要使用讀庫來操作,依次來減輕資料庫的壓力。那麼我們如何配置多資料來源?
這裡還是基於springboot應用的情況下,我們看一下怎麼配置。
因為SpringBoot會實現自動配置,但是SpringBoot並不知道我們的業務場景分別要使用哪一個資料來源,因此我們需要把相關的自動配置關閉。
首先,生成專案骨架,引入相應的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
```
**然後,在Application排除自動裝配類**
```java
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class,JdbcTemplateAutoConfiguration.class})
@Slf4j
public class MultiDataSourceDemoApplication {
}
上面程式碼中,我們排除了DataSourceAutoConfiguration、DataSourceTransactionManagerAutoConfiguration、JdbcTemplateAutoConfiguration三個類,然後就可以自己定義DataSource了。
配置資料來源
//第一個資料來源
@Bean
@ConfigurationProperties("first.datasource")
public DataSource firstDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public JdbcTemplate firstJdbcTemplate() {
return new JdbcTemplate(firstDataSource());
}
@Bean
@Resource
public PlatformTransactionManager firstTxManager(DataSource firstDataSource) {
return new DataSourceTransactionManager(firstDataSource);
}
//第二個資料來源
@Bean
@ConfigurationProperties("second.datasource")
public DataSource secondDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public JdbcTemplate secondJdbcTemplate() {
return new JdbcTemplate(secondDataSource());
}
@Bean
@Resource
public PlatformTransactionManager secondTxManager(DataSource secondDataSource) {
return new DataSourceTransactionManager(secondDataSource);
}
application.properties的配置項資訊
management.endpoints.web.exposure.include=*
spring.output.ansi.enabled=ALWAYS
first.datasource.jdbc-url=jdbc:mysql://localhost:3306/first
first.datasource.username=root
first.datasource.password=xxx
second.datasource.jdbc-url=jdbc:mysql://localhost:3306/second
second.datasource.username=root
second.datasource.password=xxx
看一下表結構和資料
執行測試程式碼:
@Test
public void testMutilDataSource(){
firstJdbcTemplate.queryForList("SELECT * FROM test1")
.forEach(row -> log.info("記錄:"+row.toString()));
secondJdbcTemplate.queryForList("SELECT * FROM test2")
.forEach(row -> log.info("記錄:"+row.toString()));
}
我們看一下執行效果:
我們可以看到,兩個資料來源都初始化成功了,並且各自資料來源執行的結果準確。
上面的方式沒有整合Mybatis,使用的是jdbcTemplate,網路上還有很多配置方式,比如動態選擇資料來源,大同小異,不過筆者還是建議不同的業務單獨指定資料來源,容易維護。
我們已經演示了簡單的單資料來源和多資料來源的配置方式,我們下一篇文章將講一下,SpringBoot預設的連線池HikariCP。