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;