在之前的分享中,我們介紹了如何使用目前最常用的三種數(shù)據(jù)訪問方式:
下面我們將分三篇來介紹在這三種數(shù)據(jù)訪問方式之下,當(dāng)我們需要多個(gè)數(shù)據(jù)源的時(shí)候,該如何使用的配置說明。
添加多數(shù)據(jù)源的配置
先在Spring Boot的配置文件application.properties
中設(shè)置兩個(gè)你要鏈接的數(shù)據(jù)庫配置,比如這樣:
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
說明與注意:
- 多數(shù)據(jù)源配置的時(shí)候,與單數(shù)據(jù)源不同點(diǎn)在于
spring.datasource
之后多設(shè)置一個(gè)數(shù)據(jù)源名稱primary
和secondary
來區(qū)分不同的數(shù)據(jù)源配置,這個(gè)前綴將在后續(xù)初始化數(shù)據(jù)源的時(shí)候用到。 - 數(shù)據(jù)源連接配置2.x和1.x的配置項(xiàng)是有區(qū)別的:2.x使用
spring.datasource.secondary.jdbc-url
,而1.x版本使用spring.datasource.secondary.url
。如果你在配置的時(shí)候發(fā)生了這個(gè)報(bào)錯(cuò)java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
,那么就是這個(gè)配置項(xiàng)的問題。
初始化數(shù)據(jù)源與JdbcTemplate
完成多數(shù)據(jù)源的配置信息之后,就來創(chuàng)建個(gè)配置類來加載這些配置信息,初始化數(shù)據(jù)源,以及初始化每個(gè)數(shù)據(jù)源要用的JdbcTemplate。你只需要在你的Spring Boot應(yīng)用下添加下面的這個(gè)配置類即可完成!
@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);
}
}
說明與注意:
- 前兩個(gè)Bean是數(shù)據(jù)源的創(chuàng)建,通過
@ConfigurationProperties
可以知道這兩個(gè)數(shù)據(jù)源分別加載了spring.datasource.primary.*
和spring.datasource.secondary.*
的配置。 @Primary
注解指定了主數(shù)據(jù)源,就是當(dāng)我們不特別指定哪個(gè)數(shù)據(jù)源的時(shí)候,就會使用這個(gè)Bean- 后兩個(gè)Bean是每個(gè)數(shù)據(jù)源對應(yīng)的
JdbcTemplate
。可以看到這兩個(gè)JdbcTemplate
創(chuàng)建的時(shí)候,分別注入了primaryDataSource
數(shù)據(jù)源和secondaryDataSource
數(shù)據(jù)源
測試一下
完成了上面之后,我們就可以寫個(gè)測試類來嘗試一下上面的多數(shù)據(jù)源配置是否正確了,比如下面這樣:
@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 {
// 往第一個(gè)數(shù)據(jù)源中插入 2 條數(shù)據(jù)
primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "aaa", 20);
primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "bbb", 30);
// 往第二個(gè)數(shù)據(jù)源中插入 1 條數(shù)據(jù),若插入的是第一個(gè)數(shù)據(jù)源,則會主鍵沖突報(bào)錯(cuò)
secondaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "ccc", 20);
// 查一下第一個(gè)數(shù)據(jù)源中是否有 2 條數(shù)據(jù),驗(yàn)證插入是否成功
Assert.assertEquals("2", primaryJdbcTemplate.queryForObject("select count(1) from user", String.class));
// 查一下第一個(gè)數(shù)據(jù)源中是否有 1 條數(shù)據(jù),驗(yàn)證插入是否成功
Assert.assertEquals("1", secondaryJdbcTemplate.queryForObject("select count(1) from user", String.class));
}
}
說明與注意:
- 可能這里你會問,有兩個(gè)JdbcTemplate,為什么不用
@Qualifier
指定?這里順帶說個(gè)小知識點(diǎn),當(dāng)我們不指定的時(shí)候,會采用參數(shù)的名字來查找Bean,存在的話就注入。 - 這兩個(gè)JdbcTemplate創(chuàng)建的時(shí)候,我們也沒指定名字,它們是如何匹配上的?這里也是一個(gè)小知識點(diǎn),當(dāng)我們創(chuàng)建Bean的時(shí)候,默認(rèn)會使用方法名稱來作為Bean的名稱,所以這里就對應(yīng)上了。大家不妨回頭看看兩個(gè)名稱是不是一致的?
注:本文轉(zhuǎn)載自“程序猿DD”,如有侵權(quán),請聯(lián)系刪除!