Spring Boot配置多个DataSource

使用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数据源:


 
 
  1. <dependency>
  2. <groupId>org.hsqldb </groupId>
  3. <artifactId>hsqldb </artifactId>
  4. <scope>runtime </scope>
  5. </dependency>

但是,在某些情况下,如果我们需要配置多个数据源,应该如何在Spring Boot中配置呢?

我们以JDBC为例,演示如何在Spring Boot中配置两个DataSource。对应的,我们会创建两个JdbcTemplate的Bean,分别使用这两个数据源。

首先,我们必须在application.yml中声明两个数据源的配置,一个使用spring.datasource,另一个使用spring.second-datasource


 
 
  1. spring:
  2. application:
  3. name: data - multidatasource
  4. datasource:
  5. driver - class - name: org .hsqldb .jdbc .JDBCDriver
  6. url: jdbc :hsqldb :mem :db1
  7. username: sa
  8. password:
  9. second - datasource:
  10. driver - class - name: org .hsqldb .jdbc .JDBCDriver
  11. url: jdbc :hsqldb :mem :db2
  12. username: sa
  13. password:

这两个DataSource都使用hsqldb,但是数据库是不同的。此外,在使用多数据源的时候,所有必要配置都不能省略。

其次,我们需要自己创建两个DataSource的Bean,其中一个标记为@Primary,另一个命名为secondDatasource


 
 
  1. @Configuration
  2. public class SomeConfiguration {
  3. @Bean
  4. @Primary
  5. @ConfigurationProperties(prefix = "spring.datasource")
  6. public DataSource primaryDataSource() {
  7. return DataSourceBuilder.create().build();
  8. }
  9. @Bean(name = "secondDatasource")
  10. @ConfigurationProperties(prefix = "spring.second-datasource")
  11. public DataSource secondDataSource() {
  12. return DataSourceBuilder.create().build();
  13. }
  14. }

对于每一个DataSource,我们都必须通过@ConfigurationProperties(prefix = "xxx")指定配置项的前缀。

紧接着,我们创建两个JdbcTemplate的Bean,其中一个标记为@Primary,另一个命名为secondJdbcTemplate,分别使用对应的DataSource


 
 
  1. @Bean
  2. @Primary
  3. public JdbcTemplate primaryJdbcTemplate(DataSource dataSource) {
  4. return new JdbcTemplate(dataSource);
  5. }
  6. @Bean(name = "secondJdbcTemplate")
  7. public JdbcTemplate secondJdbcTemplate( @Qualifier ( "secondDatasource" ) DataSource dataSource) {
  8. return new JdbcTemplate(dataSource);
  9. }

注意到secondJdbcTemplate在创建时,传入的DataSource必须用@Qualifier("secondDatasource")声明,这样,才能使用第二个DataSource

现在,我们就创建了两个JdbcTemplateBean。在需要使用第一个JdbcTemplate的地方,我们直接注入:


 
 
  1. @Component
  2. public class SomeService {
  3. @Autowired
  4. JdbcTemplate jdbcTemplate;
  5. }

在需要使用第二个JdbcTemplate的地方,我们注入时需要用@Qualifier("secondJdbcTemplate")标识:


 
 
  1. @Component
  2. public class AnotherService {
  3. @Autowired
  4. @Qualifier( "secondJdbcTemplate")
  5. JdbcTemplate secondJdbcTemplate;
  6. }

这样,我们就可以针对不同的数据源,用不同的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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值