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

相关文章
相关标签/搜索