在本系列之前的教程中,我們已經介紹瞭如何使用目前最常用的三種數據訪問方式:
下面我們將分三篇來介紹在這三種數據訪問方式之下,當我們需要多個數據源的時候,該如何使用的配置說明。
添加多數據源的配置
先在Spring Boot的配置文件application.properties
中設置兩個你要鏈接的數據庫配置,比如這樣:
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
說明與注意:
- 多數據源配置的時候,與單數據源不同點在於
spring.datasource
之後多設置一個數據源名稱primary
和secondary
來區分不同的數據源配置,這個前綴將在後續初始化數據源的時候用到。 - 數據源連接配置2.x和1.x的配置項是有區別的:2.x使用
spring.datasource.secondary.jdbc-url
,而1.x版本使用spring.datasource.secondary.url
。如果你在配置的時候發生了這個報錯java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
,那麼就是這個配置項的問題。
相關閱讀:Spring Boot 1.x基礎教程:多數據源配置
初始化數據源與JdbcTemplate
完成多數據源的配置信息之後,就來創建個配置類來加載這些配置信息,初始化數據源,以及初始化每個數據源要用的JdbcTemplate。你只需要在你的Spring Boot應用下添加下面的這個配置類即可完成!
@Configuration
public class DataSourceConfiguration {
@Primary
@Bean
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
return new JdbcTemplate(primaryDataSource);
}
@Bean
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
return new JdbcTemplate(secondaryDataSource);
}
}
說明與注意:
- 前兩個Bean是數據源的創建,通過
@ConfigurationProperties
可以知道這兩個數據源分別加載了spring.datasource.primary.*
和spring.datasource.secondary.*
的配置。 -
@Primary
註解指定了主數據源,就是當我們不特別指定哪個數據源的時候,就會使用這個Bean - 後兩個Bean是每個數據源對應的
JdbcTemplate
。可以看到這兩個JdbcTemplate
創建的時候,分別注入了primaryDataSource
數據源和secondaryDataSource
數據源
測試一下
完成了上面之後,我們就可以寫個測試類來嘗試一下上面的多數據源配置是否正確了,比如下面這樣:
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter37ApplicationTests {
@Autowired
protected JdbcTemplate primaryJdbcTemplate;
@Autowired
protected JdbcTemplate secondaryJdbcTemplate;
@Before
public void setUp() {
primaryJdbcTemplate.update("DELETE FROM USER ");
secondaryJdbcTemplate.update("DELETE FROM USER ");
}
@Test
public void test() throws Exception {
// 往第一個數據源中插入 2 條數據
primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "aaa", 20);
primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "bbb", 30);
// 往第二個數據源中插入 1 條數據,若插入的是第一個數據源,則會主鍵衝突報錯
secondaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "ccc", 20);
// 查一下第一個數據源中是否有 2 條數據,驗證插入是否成功
Assert.assertEquals("2", primaryJdbcTemplate.queryForObject("select count(1) from user", String.class));
// 查一下第一個數據源中是否有 1 條數據,驗證插入是否成功
Assert.assertEquals("1", secondaryJdbcTemplate.queryForObject("select count(1) from user", String.class));
}
}
說明與注意:
- 可能這裏你會問,有兩個JdbcTemplate,爲什麼不用
@Qualifier
指定?這裏順帶說個小知識點,當我們不指定的時候,會採用參數的名字來查找Bean,存在的話就注入。 - 這兩個JdbcTemplate創建的時候,我們也沒指定名字,它們是如何匹配上的?這裏也是一個小知識點,當我們創建Bean的時候,默認會使用方法名稱來作爲Bean的名稱,所以這裏就對應上了。讀者不妨回頭看看兩個名稱是不是一致的?
代碼示例
本文的相關例子可以查看下面倉庫中的chapter3-7
目錄:
- Github:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您覺得本文不錯,歡迎Star支持,您的關注是我堅持的動力!
本文首發於:Spring Boot 2.x基礎教程:JdbcTemplate的多數據源配置,轉載請註明出處。
歡迎關注我的公衆號:程序猿DD,獲得獨家整理的學習資源和日常乾貨推送。
如果您對我的其他專題內容感興趣,也可以關注我的博客:didispace.com。