[轉] Spring Boot配置多個DataSource

來源:互聯網
上載者:User

標籤:password   bsp   primary   記憶體   str   一個   url   span   jdb   

[From]  https://www.liaoxuefeng.com/article/001484212576147b1f07dc0ab9147a1a97662a0bd270c20000

 

Spring Boot配置多個DataSource

廖雪峰 / 編程 / 1-13 10:11 / 閱讀: 14041

使用Spring Boot時,預設情況下,配置DataSource非常容易。Spring Boot會自動為我們配置好一個DataSource

如果在application.yml中指定了spring.datasource的相關配置,Spring Boot就會使用該配置建立一個DataSource。如果在application.yml中沒有指定任何spring.datasource的相關配置,Spring Boot會在classpath中搜尋H2、hsqldb等記憶體資料庫的jar包,如果找到了,就會自動設定一個記憶體資料庫的DataSource,所以,我們只要引入jar包即可。例如,配置一個hsqldb資料來源:

<dependency>    <groupId>org.hsqldb</groupId>    <artifactId>hsqldb</artifactId>    <scope>runtime</scope></dependency>

但是,在某些情況下,如果我們需要配置多個資料來源,應該如何在Spring Boot中配置呢?

我們以JDBC為例,示範如何在Spring Boot中配置兩個DataSource。對應的,我們會建立兩個JdbcTemplate的Bean,分別使用這兩個資料來源。

首先,我們必須在application.yml中聲明兩個資料來源的配置,一個使用spring.datasource,另一個使用spring.second-datasource

spring:  application:    name: data-multidatasource  datasource:    driver-class-name: org.hsqldb.jdbc.JDBCDriver    url: jdbc:hsqldb:mem:db1    username: sa    password:  second-datasource:    driver-class-name: org.hsqldb.jdbc.JDBCDriver    url: jdbc:hsqldb:mem:db2    username: sa    password:

這兩個DataSource都使用hsqldb,但是資料庫是不同的。此外,在使用多資料來源的時候,所有必要配置都不能省略。

其次,我們需要自己建立兩個DataSource的Bean,其中一個標記為@Primary,另一個命名為secondDatasource

@Configurationpublic class SomeConfiguration {    @Bean    @Primary    @ConfigurationProperties(prefix = "spring.datasource")    public DataSource primaryDataSource() {        return DataSourceBuilder.create().build();    }    @Bean(name = "secondDatasource")    @ConfigurationProperties(prefix = "spring.second-datasource")    public DataSource secondDataSource() {        return DataSourceBuilder.create().build();    }}

對於每一個DataSource,我們都必須通過@ConfigurationProperties(prefix = "xxx")指定配置項的首碼。

緊接著,我們建立兩個JdbcTemplate的Bean,其中一個標記為@Primary,另一個命名為secondJdbcTemplate,分別使用對應的DataSource

@Bean@Primarypublic JdbcTemplate primaryJdbcTemplate(DataSource dataSource) {    return new JdbcTemplate(dataSource);}@Bean(name = "secondJdbcTemplate")public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDatasource") DataSource dataSource) {    return new JdbcTemplate(dataSource);}

注意到secondJdbcTemplate在建立時,傳入的DataSource必須用@Qualifier("secondDatasource")聲明,這樣,才能使用第二個DataSource

現在,我們就建立了兩個JdbcTemplateBean。在需要使用第一個JdbcTemplate的地方,我們直接注入:

@Componentpublic class SomeService {    @Autowired    JdbcTemplate jdbcTemplate;}

在需要使用第二個JdbcTemplate的地方,我們注入時需要用@Qualifier("secondJdbcTemplate")標識:

@Componentpublic class AnotherService {    @Autowired    @Qualifier("secondJdbcTemplate")    JdbcTemplate secondJdbcTemplate;}

這樣,我們就可以針對不同的資料來源,用不同的JdbcTemplate進行操作。

注意事項

當存在多個相同類型的Bean,例如,多個DataSource,多個JdbcTemplate時,強烈建議總是使用@Primary把其中某一個Bean標識為“主要的”,使用@Autowired注入時會首先使用被標記為@Primary的Bean。

相同類型的其他Bean,每一個都需要用@Bean(name="xxx")標識名字,並且,在使用@Autowired注入時配合@Qualifier("xxx")指定注入的Bean的名字。

完整的樣本工程源碼請參考:

https://github.com/michaelliao/springcloud/tree/master/data-multidatasource

[轉] Spring Boot配置多個DataSource

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.