<!-- 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  写的很详细,我就不重复造轮子了

 

springboot添加多数据源 以及 动态添加数据源动态切换数据源的更多相关文章

  1. SpringBoot多数据源动态切换数据源

    1.配置多数据源 spring: datasource: master: password: erp_test@abc url: jdbc:mysql://127.0.0.1:3306/M201911 ...

  2. SpringBoot运行时动态添加数据源

    此方案适用于解决springboot项目运行时动态添加数据源,非静态切换多数据源!!! 一.多数据源应用场景: 1.配置文件配置多数据源,如默认数据源:master,数据源1:salve1...,运行 ...

  3. 动态添加数据源,根据用户登录切换数据库.编程式Spring事务.

    根据用户注册,系统自动创建私有数据库,用户登录,动态添加数据源到Spring数据路由,Session超时删除数据源 好处:当数据量大的时候,类似水平切割效果,效率会高一些 坏处:数据源切换,Sprin ...

  4. 为tomcat动态添加jndi数据源信息

    我们在开发项目的时候,总要和数据库打交道,如何获取数据源,以什么样的方式来获取,成为了我们即简单又熟悉而且不得不注意的一个问题. 那么在这里我说三种获取数据源的常用方式: 一.通过配置文件来获取 首先 ...

  5. Springboot+Mybatis+Pagehelper+Aop动态配置Oracle、Mysql数据源

      本文链接:https://blog.csdn.net/wjy511295494/article/details/78825890 Springboot+Mybatis+Pagehelper+Aop ...

  6. SpringBoot之多数据源动态切换数据源

    原文:https://www.jianshu.com/p/cac4759b2684 实现 1.建库建表 首先,我们在本地新建三个数据库名分别为master,slave1,slave2,我们的目前就是写 ...

  7. elastic-job 分布式定时任务框架 在 SpringBoot 中如何使用(二)动态添加任务需求

    之前一篇用过了如何在使用创建最简单的任务:比如每天定时清空系统的缓存 这篇文章主要讲解:如何运用elastic-job-lite做灵活的细粒度任务,比如: 如何定时取消某个订单在下订单后30分钟未支付 ...

  8. SpringBoot定时任务升级篇(动态添加修改删除定时任务)

    需求缘起:在发布了<Spring Boot定时任务升级篇>之后得到不少反馈,其中有一个反馈就是如何动态添加修改删除定时任务?那么我们一起看看具体怎么实现,先看下本节大纲: (1)思路说明: ...

  9. Springboot+Mybatis AOP注解动态切换数据源

    在开发中因需求在项目中需要实现多数据源(虽然项目框架是SpringCloud,但是因其中只是单独的查询操作,觉得没必要开发一个项目,所以采用多数据源来进行实现) 1.在配置文件中创建多个数据连接配置 ...

  10. springboot集成mongodb实现动态切换数据源

    主要实现原理,利用spring的aop 在切入点执行db操作之前 将数据库切换: 本例子采用aop在controller进行拦截 拦截到MongoTemplate.class 切换数据源后重新放回去 ...

随机推荐

  1. F#周报2019年第3期

    新闻 SAFE最近的活动 什么开源项目适合我们的奖学金受益者上手工作 布署SAFE应用至Google Cloud AppEngine Alea GPU:使用F#进行GPU编程 Rider 2018.3 ...

  2. Kruskal和prime算法的类实现,图的遍历BFS算法。

    一.图的遍历 #include<iostream> #include<queue> #include<vector> using namespace std; in ...

  3. 2016ACM/ICPC亚洲区沈阳站 - A/B/C/E/G/H/I - (Undone)

    链接:传送门 A - Thickest Burger - [签到水题] ACM ICPC is launching a thick burger. The thickness (or the heig ...

  4. vim创建程序文件自动添加头部注释/自动文件头注释与模板定义

    Vim 自动文件头注释与模板定义 在vim的配置文件.vimrc添加一些配置可以实现创建新文件时自动添加文件头注释,输入特定命令可以生成模板. 使用方法 插入模式输入模式输入seqlogic[Ente ...

  5. Vue2.0 v-for 中 :key 到底有什么用?

    要解释 key 的作用,不得不先介绍一下虚拟 DOM 的 Diff 算法了. vue 和 react 的虚拟 DOM 的Diff算法大致相同,其核心是基于两个简单的假设: 1.两个相同的组件产生类似的 ...

  6. drawrect&layoutsubviews

    drawrect触发方法: 设置frame setneeddisplay contentmode设置为redraw sizetofit layoutsubviews触发方法 setframe layo ...

  7. mysql报错Ignoring the redo log due to missing MLOG_CHECKPOINT between

    mysql报错Ignoring the redo log due to missing MLOG_CHECKPOINT between mysql版本:5.7.19 系统版本:centos7.3 由于 ...

  8. 认识拨号计划-dialplan

    拨号计划是 FreeSWITCH 中至关重要的一部分.它的主要作用就是对电话进行路由(从这一点上来说,相当于一个路由表).说的简明一点,就是当一个用户拨号时,对用户所拨的号码进行分析,进而决定下一步该 ...

  9. 大数据Spark+Kafka实时数据分析案例

    本案例利用Spark+Kafka实时分析男女生每秒购物人数,利用Spark Streaming实时处理用户购物日志,然后利用websocket将数据实时推送给浏览器,最后浏览器将接收到的数据实时展现, ...

  10. gateway + jwt 网关认证

    思路: 全局过滤器对所有的请求拦截(生成token有效期30分钟,放入redis设置有效期3天.3天之类可以通过刷新接口自动刷新,超过3天需要重新登录.) 前端在调用接口之前先判断token是否过期( ...