Spring Boot配置多個DataSource

使用Spring Boot時,默認狀況下,配置DataSource很是容易。Spring Boot會自動爲咱們配置好一個DataSourcegit

若是在application.yml中指定了spring.datasource的相關配置,Spring Boot就會使用該配置建立一個DataSource。若是在application.yml中沒有指定任何spring.datasource的相關配置,Spring Boot會在classpath中搜索H二、hsqldb等內存數據庫的jar包,若是找到了,就會自動配置一個內存數據庫的DataSource,因此,咱們只要引入jar包便可。例如,配置一個hsqldb數據源:github

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

可是,在某些狀況下,若是咱們須要配置多個數據源,應該如何在Spring Boot中配置呢?spring

咱們以JDBC爲例,演示如何在Spring Boot中配置兩個DataSource。對應的,咱們會建立兩個JdbcTemplate的Bean,分別使用這兩個數據源。sql

首先,咱們必須在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,可是數據庫是不一樣的。此外,在使用多數據源的時候,全部必要配置都不能省略。app

其次,咱們須要本身建立兩個DataSource的Bean,其中一個標記爲@Primary,另外一個命名爲secondDatasourceui

@Configuration
public 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")指定配置項的前綴。url

緊接着,咱們建立兩個JdbcTemplate的Bean,其中一個標記爲@Primary,另外一個命名爲secondJdbcTemplate,分別使用對應的DataSourcespa

@Bean
@Primary
public 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.net

如今,咱們就建立了兩個JdbcTemplateBean。在須要使用第一個JdbcTemplate的地方,咱們直接注入:

@Component
public class SomeService {
    @Autowired
    JdbcTemplate jdbcTemplate;
}

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

@Component
public 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

相關文章
相關標籤/搜索