前言#
我們在實際場景中,會有需要配置多個資料源的場景,比如說,我們在支付系統中,單筆操作(包含查詢、插入、新增)中需要操作主庫,在批量查詢或者對賬單查詢等對實時性要求不高的場景,需要使用讀庫來操作,依次來減輕資料庫的壓力,那么我們如何配置多資料源?
這里還是基于springboot應用的情況下,我們看一下怎么配置,
因為SpringBoot會實作自動配置,但是SpringBoot并不知道我們的業務場景分別要使用哪一個資料源,因此我們需要把相關的自動配置關閉,
首先,生成專案骨架,引入相應的依賴
Copy Line-numbers language-xml <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了,
配置資料源
Copy Line-numbers language-java //第一個資料源
@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的配置項資訊
Copy Line-numbers language-xmlmanagement.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
看一下表結構和資料


運行測驗代碼:
Copy Line-numbers language-java @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()));
}
我們看一下運行效果:

我們可以看到,兩個資料源都初始化成功了,并且各自資料源執行的結果準確
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317829.html
標籤:其他
上一篇:程式員之桃花庵
