Spring boot多数据源配置实践

145 阅读1分钟
  1. 首先引入pom,包括mybatis-starter以及动态数据源
<!--- mybatis starter --->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
<!-- 动态数据源 --->
<dependency>
    <groupId>com.baoidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.3.1</version>
</dependency>
  1. 定义数据源
    2.1 数据源配置类
/**
 * 主数据源配置
 */
@Configuration
@MapperScan(basePackages = {"com.test1.repository"}, sqlSessionTemplateRef="test1SqlSessionTemplate")
public class DataSourceTest1Config {

    @Primary
    @Bean(name = "test1Datasource")
    @ConfigurationProperties(prefix="spring.datasource.test1")
    public DataSouce dataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Primary
    @Bean(name= "test1SqlSessionFactory")
    public SqlSessionFactory sqlSessionnFactory(@Qualifier("test1Datasource") DataSource dataSource) {
        MybatisSqlSessionFactoryBean beann = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver("classpath*:mappers/*_test1.xml"));
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        bean.setPlugins(interceptor);
        return bean.getObject();
    }
    
    @Primary
    @Bean(name="test1TrannsactionManager")
    public DataSourceTransactionManager test1TransactionManager(@Qualifier("test1Datasource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    
    @Primary
    @Bean(name="test1SqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionnFactory) {
        return new SqlSessionTemplate(sqlSessionnFactory);
    }
    
    @Primary
    @Bean
    public DataSourceInitializer dataSourceInitializer(@Qualifier("test1Datasource") DataSource dataSource) {
        ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
        DataSourceInitializer initial = new DataSourceInitializer();
        initial.setDataSource(dataSource);
        initial.setDatabasePopulator(resourceDatabasePopulator);
    } 
}
/**
 * slave数据源配置
 */
@Configuration
@MapperScan(basePackages = {"com.test2.repository"}, sqlSessionTemplateRef="test2SqlSessionTemplate")
public class DataSourceTest1Config {

    @Bean(name = "test2Datasource")
    @ConfigurationProperties(prefix="spring.datasource.test2")
    public DataSouce dataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean(name= "test2SqlSessionFactory")
    public SqlSessionFactory sqlSessionnFactory(@Qualifier("test2Datasource") DataSource dataSource) {
        MybatisSqlSessionFactoryBean beann = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver("classpath*:mappers/*_test1.xml"));
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        bean.setPlugins(interceptor);
        return bean.getObject();
    }
    
    @Bean(name="test2TrannsactionManager")
    public DataSourceTransactionManager test1TransactionManager(@Qualifier("test2Datasource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    
    @Bean(name="test2SqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionnFactory) {
        return new SqlSessionTemplate(sqlSessionnFactory);
    }
}

2.2 spring参数配置

spring.datasource.test1.username=
spring.datasource.test1.password=
spring.datasource.test1.jdbc-url=
spring.datasource.test1.driver-class-name=
....
spring.datasource.test2.username=
spring.datasource.test2.password=
spring.datasource.test2.jdbc-url=
spring.datasource.test2.driver-class-name=
....

  1. 项目结构
--test
 |---src
 |----main
 |-----java
 |-------com
 |---------test1
 |----------repository
 |---------test2
 |----------repository