在项目中遇到了需要配置多个数据库源的情况,这里简要记录一下如何进行配置。
通过网上的搜索主要参考springboot官方文档双数据源配置进行了配置。
一、YAML配置
首先,需要在application.yaml文件中配置数据源,首先看一下但数据源的配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
username: test
password: test
对于多数据源,我们需要在datasource下分别为其分配别名进行配置
spring:
datasource:
primary:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
username: test
password: test
type: com.zaxxer.hikari.HikariDataSource
hikari:
pool-name: HikariCP-Primary
mininum-idle: 5
idle_timeout: 600000
maxinum-pool-size: 15
auto-commit: true
max-lifetime: 1200000
connection-timeout: 30000
connection-test-query: SELECT 1 FROM DUAL
second:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@//localhost:1521/test
username: test
password: test
type: com.zaxxer.hikari.HikariDataSource
hikari:
pool-name: HikariCP-Second
mininum-idle: 5
idle_timeout: 600000
maxinum-pool-size: 10
auto-commit: true
max-lifetime: 1200000
connection-timeout: 30000
connection-test-query: SELECT 1 FROM DUAL
这里设置了两个数据源,其中primary为MySQL,second为Oracle
二、java config配置
我们可以对两个数据源写两个java config分别进行设置
1. PrimaryDataSourceConfig.java
package com.iflytek.cga.estimate.config;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
/**
* @Description 主要数据源配置
*/
@Configuration
@MapperScan(basePackages = "com.xxx.xxx.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {
/**
* 指定mapper xml文件路径
*/
public static final String MAPPER_LOCATION = "classpath:mapper/*.xml";
@Bean
@Primary
@ConfigurationProperties("spring.datasource.primary")
public DataSourceProperties primaryDataSourceProperties() {
return new DataSourceProperties();
}
@Primary
@Bean("primaryDataSource")
@Qualifier(value = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary.hikari")
public HikariDataSource primaryDataSource() {
return primaryDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
@Primary
@Bean(name = "primarySqlSessionFactory")
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
final MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(PrimaryDataSourceConfig.MAPPER_LOCATION));
return sessionFactoryBean.getObject();
}
}
2. SecondDataSourceConfig.java
package com.iflytek.cga.estimate.config;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
/**
* second数据源配置
*/
@Configuration
@MapperScan(basePackages = "com.xxx.xxx.second.mapper", sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig {
/**
* 指定mapper xml文件路径
*/
public static final String MAPPER_LOCATION = "classpath:oracle/mapper/*.xml";
@Bean
@ConfigurationProperties("spring.datasource.second")
public DataSourceProperties secondDataSourceProperties() {
return new DataSourceProperties();
}
@Bean("secondDataSource")
@Qualifier(value = "secondDataSource")
@ConfigurationProperties(prefix = "spring.datasource.second.hikari")
public HikariDataSource secondDataSource() {
return secondDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}
@Bean(name = "secondSqlSessionFactory")
public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception {
final MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(SecondDataSourceConfig.MAPPER_LOCATION));
return sessionFactoryBean.getObject();
}
}
这里需要注意的地方有以下几处:
首先对DataSource进行配置时,需要使用@Primary或者@Qualifier区分相同类型的Bean;
其次,不同数据源的mapper将其放入不同路径的包内,然后通过@MapperScan去扫描对应的包,即不同的包对应不同的数据源;
最后如果需要使用mybatis-plus,需要将SqlSessionFactory配置成MybatisSqlSessionFactoryBean进行返回,否则只能写xml文件来实现数据库的CRUD