Springboot多数据源配置

Springboot多数据源配置


Springboot多数据源配置

项目中存在支持多种数据库的需求:

  • 要同时具备两种数据库操作的能力

或者

  • 可根据配置文件切换

1 改动配置文件,获取对应的数据源

如下,在配置文件中定义两种,将其中一种注释

#mysql
#spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxx?#useUnicode=true&characterEncoding=UTF-8&useSSL=false
#spring.datasource.username=root
#spring.datasource.password=root
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#oracle
spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver

在使用JdbcTemplate操作数据库时,以上面的这种方式获取DataSource

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
   return new JdbcTemplate(dataSource);
}

2 配置文件中存在两种以上数据源

1 中是对于单数据源的操作,比较传统简单,但有时并不能满足需求。

使用以上方式来满足需求,修改配置文件,都保留,不需要注释其他数据源配置。

spring.datasource.primary.url=jdbc:mysql://127.0.0.1:3306/xxx?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver

#oracle
spring.datasource.secondary.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=oracle.jdbc.driver.OracleDriver

spring中使用@Autowired, 默认是根据类型Type来自动注入的。考虑以下情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary 的作用就出来了。

因此如果有多个类型一样的Bean候选者,则需要限定其中一个候选者,否则将抛出异常。@Qualifier指定选用的Bean

org.springframework.boot 1.5.8.RELEASE

import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

@Configuration
public class DataSourceConfig {

    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")//读取配置文件里前缀 为"spring.datasource.primary"的语句
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @Primary// 指定此Bean 在此类型中 为首选
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "primaryJdbcTemplate")
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);

    }
    @Bean(name = "secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
    
}

3 测试

	// 如: 引入JdbcTemplate  使用@Qualifier 指定Bean
    @Autowired
    @Qualifier("primaryJdbcTemplate")
    protected JdbcTemplate jdbcTemplate1;

    @Autowired
    @Qualifier("secondaryJdbcTemplate")
    protected JdbcTemplate jdbcTemplate2;