Spring系列之多個資料來源配置

程式設計師阿牛發表於2021-08-24

前言

在上篇文章講到了如何配置單資料來源,但是在實際場景中,會有需要配置多個資料來源的場景,比如說,我們在支付系統中,單筆操作(包含查詢、插入、新增)中需要操作主庫,在批量查詢或者對賬單查詢等對實時性要求不高的場景,需要使用讀庫來操作,依次來減輕資料庫的壓力。那麼我們如何配置多資料來源?

這裡還是基於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

看一下表結構和資料
file
file

執行測試程式碼:

	@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()));
	}

我們看一下執行效果:

file

我們可以看到,兩個資料來源都初始化成功了,並且各自資料來源執行的結果準確。

上面的方式沒有整合Mybatis,使用的是jdbcTemplate,網路上還有很多配置方式,比如動態選擇資料來源,大同小異,不過筆者還是建議不同的業務單獨指定資料來源,容易維護。
我們已經演示了簡單的單資料來源和多資料來源的配置方式,我們下一篇文章將講一下,SpringBoot預設的連線池HikariCP。

相關文章