springboot添加多数据源 以及 动态添加数据源动态切换数据源

时间:2023-02-24 17:06:06
<!-- 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. 动态添加数据源&comma;根据用户登录切换数据库&period;编程式Spring事务&period;

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

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

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

  5. Springboot&plus;Mybatis&plus;Pagehelper&plus;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&plus;Mybatis AOP注解动态切换数据源

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

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

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

随机推荐

  1. Lucene&period;net初探

    引言 在分析同事开发的客户端搜索项目时注意到,搜索的关键是索引,而提到索引就不得不提Lucene.net,思路就是将需要搜索内容写入索引,客户端自己或局域网其他机器搜索时直接搜索索引,从而查看到你共享 ...

  2. iOS 向客户发送xcarchive文件(整理中)

    由于安全的原因,客户不会把app的 distribution provisioning profile给开发者的,但是可以给一个development provisioning profile.这种情 ...

  3. ZT 螨虫知识2

    病情分析:过敏是治不好的,只能做到避免接触.指导意见:螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,尤其是狗经常去的地方,草地就是螨虫的传播介质.你是过敏性体质除了被免过敏性源外,还要增强体质, ...

  4. windows7下安装php的imagick和imagemagick扩展教程

    这篇文章主要介绍了windows7下安装php的imagick和imagemagick扩展教程,同样也适应XP操作系统,Win8下就没测试过了,需要的朋友可以参考下 最近的PHP项目中,需要用到切图和 ...

  5. 为了启动我在openshift的angular应用

    在Windows环境下搭建OpenShift环境,安装客户端工具rhc,首先需要安装Ruby和Git,参阅https://developers.openshift.com/en/getting-sta ...

  6. Amazon MWS 上传数据 (一) 设置服务

    Amazon 上传数据的流程为: 通过 SubmitFeed 操作.加密标头和所有必需的元数据(包括 FeedType 的值在内),来提交 XML 或文本型数据文件.正如亚马逊 MWS的所有提交内容一 ...

  7. 阿里云-对象储存OSS

    最近 需要搞一个阿里云的文件上传 手机端主要做了图片上传 pod安装:pod 'AliyunOSSiOS', '~> 2.5.2' 主要就是需要四个参数:accessKey secretKey  ...

  8. 使用Flex4容器若干技巧

    本文适用于正在寻找使用Flex 4容器和布局的快速参考指南的开发人员. 尽管这不一定是一个复杂问题,但这似乎是许多开发人员的挫折的来源,特别是对于那些Flex刚刚入门的开发人员. 当开发人员不知道如何 ...

  9. 使用 &quot&semi;java -jar&quot&semi;命令启动jar包时报不支持的jdk版本异常

    在使用java -jar 命令启动一个jar包的时候,提示版本不支持: [root@hadoop01 eureka-server-master]# java -jar xuebusi-eureka-s ...

  10. js dom添加回车事件

    <!DOCTYPE html> <html lang="en" class="no-js"> <head> <meta ...