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
看一下表結構和資料
執行測試程式碼:
@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。