Spring Boot 2.x基礎教程:JdbcTemplate的多數據源配置

在本系列之前的教程中,我們已經介紹瞭如何使用目前最常用的三種數據訪問方式:

下面我們將分三篇來介紹在這三種數據訪問方式之下,當我們需要多個數據源的時候,該如何使用的配置說明。

添加多數據源的配置

先在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

說明與注意

  1. 多數據源配置的時候,與單數據源不同點在於spring.datasource之後多設置一個數據源名稱primarysecondary來區分不同的數據源配置,這個前綴將在後續初始化數據源的時候用到。
  2. 數據源連接配置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);
    }

}

說明與注意

  1. 前兩個Bean是數據源的創建,通過@ConfigurationProperties可以知道這兩個數據源分別加載了spring.datasource.primary.*spring.datasource.secondary.*的配置。
  2. @Primary註解指定了主數據源,就是當我們不特別指定哪個數據源的時候,就會使用這個Bean
  3. 後兩個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));
    }

}

說明與注意

  1. 可能這裏你會問,有兩個JdbcTemplate,爲什麼不用@Qualifier指定?這裏順帶說個小知識點,當我們不指定的時候,會採用參數的名字來查找Bean,存在的話就注入。
  2. 這兩個JdbcTemplate創建的時候,我們也沒指定名字,它們是如何匹配上的?這裏也是一個小知識點,當我們創建Bean的時候,默認會使用方法名稱來作爲Bean的名稱,所以這裏就對應上了。讀者不妨回頭看看兩個名稱是不是一致的?

代碼示例

本文的相關例子可以查看下面倉庫中的chapter3-7目錄:

如果您覺得本文不錯,歡迎Star支持,您的關注是我堅持的動力!

本文首發於:Spring Boot 2.x基礎教程:JdbcTemplate的多數據源配置,轉載請註明出處。
歡迎關注我的公衆號:程序猿DD,獲得獨家整理的學習資源和日常乾貨推送。
如果您對我的其他專題內容感興趣,也可以關注我的博客:didispace.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章