springboot添加多數據源 以及 動態添加數據源動態切換數據源


<!-- Druid 數據連接池依賴 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>
//指定使用Druid做數據源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
//數據源配置一 spring.datasource.sod.driverClassName=oracle.jdbc.driver.OracleDriver spring.datasource.sod.validationQuery=SELECT 1 FROM DUAL spring.datasource.sod.filters=stat,wall spring.datasource.sod.url=jdbc:oracle:thin:@192.168.**.***:1521:xxxx spring.datasource.sod.username=xxx spring.datasource.sod.password=xxx //數據源配置二 spring.datasource.base.url=jdbc:oracle:thin:@192.168.**.**:1521:xxxx spring.datasource.base.username=xxx spring.datasource.base.password=xxx

 多數據源配置:

在熟悉了單實例數據源的實現后,不難看出,在Spring Boot中,通過為該數據源DataSource初始化一個與之對應的SessionFactory,從而實現連接。因此在面對多數據源的時候,可以分別為每個數據源寫一個mybatis的config類,使其每個DataSource都擁有一個只屬於自己的SessionFactory,這樣就可以根據各自的mapper映射目錄找到對應的mybaits實例; 
這種實現方法要求不同的mybatis實例的mapper映射目錄不能相同

 把一個配置類作下的Bean命名統一,並注入相應的Bean,從而可以保證每一個SessionFactory所對應的配置信息唯一;具體配置如下: 
第一個數據源的配置

SodDataSourceConfig

package com.ch.XX.fetch.config.ds;

import com.github.pagehelper.PageHelper;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration //掃描 Mapper 接口並容器管理
@MapperScan(basePackages = SodDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "sodSqlSessionFactory")
public class SodDataSourceConfig {

    // 精確到 sod 目錄,以便跟其他數據源隔離
    static final String PACKAGE = "com.ch.oneservice.fetch.sodDao";//DAO所在目錄 static final String MAPPER_LOCATION = "classpath:mapper/sod/*Mapper.xml";//Mapper.xml所在目錄

    @Value("${spring.datasource.type}")
    private Class<? extends DataSource> dataSourceType;//數據源類型

    @Bean(name = "sodDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.sod")  //application.property中配置文件的前綴 public DataSource sodDataSource() {
        return DataSourceBuilder.create().type(dataSourceType).build();
    }

    @Bean(name = "sodPageHelper")
    public PageHelper pageHelper() {
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
        p.setProperty("dialect", "oracle");
        pageHelper.setProperties(p);
        return pageHelper;
    }

    @Bean(name = "sodTransactionManager")
    public DataSourceTransactionManager baseTransactionManager() {
        return new DataSourceTransactionManager(sodDataSource());
    }

    @Bean(name = "sodSqlSessionFactory")
    public SqlSessionFactory baseSqlSessionFactory(@Qualifier("sodDataSource") DataSource sodDataSource,
                                                    @Qualifier("sodPageHelper") PageHelper sodPageHelper)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(sodDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(SodDataSourceConfig.MAPPER_LOCATION));
        sessionFactory.setPlugins(new Interceptor[]{sodPageHelper});
        return sessionFactory.getObject();
    }
}

第二個數據源類似

BaseDataSourceConfig

package com.ch.oneservice.fetch.config.ds;

import com.github.pagehelper.PageHelper;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
// 掃描 Mapper 接口並容器管理
@MapperScan(basePackages = BaseDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "baseSqlSessionFactory")
public class BaseDataSourceConfig {

    // 精確到 master 目錄,以便跟其他數據源隔離
    static final String PACKAGE = "com.ch.oneservice.fetch.dao";
    static final String MAPPER_LOCATION = "classpath:mapper/base/*Mapper.xml";

    @Value("${spring.datasource.type}")
    private Class<? extends DataSource> dataSourceType;

    @Bean(name = "baseDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.base")
    @Primary
    public DataSource baseDataSource() {
        return DataSourceBuilder.create().type(dataSourceType).build();
    }

    @Bean(name = "basePageHelper")
    public PageHelper pageHelper() {
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
        p.setProperty("dialect", "oracle");
        pageHelper.setProperties(p);
        return pageHelper;
    }

    @Bean(name = "baseTransactionManager")
    @Primary
    public DataSourceTransactionManager baseTransactionManager() {
        return new DataSourceTransactionManager(baseDataSource());
    }

    @Bean(name = "baseSqlSessionFactory")
    @Primary
    public SqlSessionFactory baseSqlSessionFactory(@Qualifier("baseDataSource") DataSource baseDataSource,
                                                   @Qualifier("basePageHelper") PageHelper basePageHelper)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(baseDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(BaseDataSourceConfig.MAPPER_LOCATION));
        sessionFactory.setPlugins(new Interceptor[]{basePageHelper});
        return sessionFactory.getObject();
    }
}

完成配置文件的配置后,可在工程目錄的mapper包下新建兩個目錄:UserMapper和StudentMapper,分別對應兩個數據源。這兩個目錄只能同級,或者不同目錄,不能互為子父目錄。

 

然后使用的時候只需要把相應數據庫資源的業務層代碼寫到對應的包下,項目就可以自己匹配相應的SqlSessionFactory去執行相應的查詢

 

動態數據源加載:

參考如下文章:https://blog.csdn.net/YHYR_YCY/article/details/78894940  寫的很詳細,我就不重復造輪子了

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM