背景:最近有一个需求是根据app传来的请求参数,根据行政部门编码请求不同地区的数据,之前写的多数据源都是固定某个方法调用指定的dao然后查询不同的数据库,但是这次是需要根据前端传入参数进行动态区分数据库,所以就需要做特殊处理

1.注册多数据源:

@Configuration
public class DataSourceConfiguration { /**
* 交管局数据源
*/
@Bean(name = "jiaoguanjuDataSource")
@Qualifier("jiaoguanjuDataSource")
@ConfigurationProperties(prefix="spring.datasource.jiaoguanju")
public DataSource jiaoguanjuDataSource() {
return DataSourceBuilder.create().build();
} /**
* 广州数据源
*/
@Bean(name = "guangzhouDataSource")
@Qualifier("guangzhouDataSource")
@ConfigurationProperties(prefix="spring.datasource.guangzhou")
public DataSource guangzhouDataSource() {
return DataSourceBuilder.create().build();
}
/**
* 清远数据源
*/
@Bean(name = "qingyuanDataSource")
@Qualifier("qingyuanDataSource")
@ConfigurationProperties(prefix="spring.datasource.qingyuan")
public DataSource qingyuanDataSource() {
return DataSourceBuilder.create().build();
} /**
* 韶关数据源
*/
@Bean(name = "shaoguanDataSource")
@Qualifier("shaoguanDataSource")
@ConfigurationProperties(prefix="spring.datasource.shaoguan")
public DataSource shaoguanDataSource() {
return DataSourceBuilder.create().build();
} /**
* cancl数据源
*/
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix="spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
} @Bean(name = "dynamicDataSource")
@Primary
public DataSource dynamicDataSource(){
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.myMap = new HashMap<>();//保存我们有的数据源,方便后面动态增加
dynamicDataSource.myMap.put("guangzhou",guangzhouDataSource());
dynamicDataSource.myMap.put("qingyuan",qingyuanDataSource());
dynamicDataSource.myMap.put("shaoguan",shaoguanDataSource());
dynamicDataSource.myMap.put("jiaoguanju", jiaoguanjuDataSource());
// dynamicDataSource.myMap.put("3",thirdDataSource());
dynamicDataSource.setTargetDataSources(dynamicDataSource.myMap);//父类的方法
DynamicDataSourceContextHolder.dataSourceIds.addAll(dynamicDataSource.myMap.keySet());
dynamicDataSource.setDefaultTargetDataSource(guangzhouDataSource());//父类的方法
return dynamicDataSource;
} }

2.将数据源交给AbstractRoutingDataSource

/**
* @Author Cheng ZhiHua
* @Date 2019-11-05 16:01
* @Description 核心方法 :继承AbstractRoutingDataSource 类,将数据源交给AbstractRoutingDataSource进行注入使用
**/
@Slf4j
public class DynamicDataSource extends AbstractRoutingDataSource { public Map<Object,Object> myMap = null; @Override
protected Object determineCurrentLookupKey() {
/*
* DynamicDataSourceContextHolder代码中使用setDataSourceType
* 设置当前的数据源,在路由类中使用getDataSourceType进行获取,
* 交给AbstractRoutingDataSource进行注入使用。
*/
// log.info("数据源为: {}",DynamicDataSourceContextHolder.getDataSourceType());
return DynamicDataSourceContextHolder.getDataSourceType(); } }

3.每个请求与线程绑定,保证各个请求之前互不影响

/**
* @Author Cheng ZhiHua
* @Date 2019-11-05 16:02
* @Description
**/
public class DynamicDataSourceContextHolder {
/* * 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本, * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 */ private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static List<Object> dataSourceIds = new ArrayList<Object>(); public static void setDataSourceType(String dataSourceType) { contextHolder.set(dataSourceType); } public static String getDataSourceType() { return contextHolder.get(); } public static void clearDataSourceType() { contextHolder.remove(); } public static boolean containsDataSource(String dataSourceId) { return dataSourceIds.contains(dataSourceId); } }

4.调用一定要在事务之前,在controller层

/**
* 设置当前线程的数据库连接
*
* @param data
*/
private void ThreadLocalParamSet(Map<String, Object> data) {
Map<String, String> userInfo = (Map<String, String>) data.get("userInfo");
String dataSourceType =
deptnoReleaseDatasourceMap.get(userInfo.get("userDeptNo").substring(0, 4));
DynamicDataSourceContextHolder.setDataSourceType(dataSourceType);
}

springboot 之 根据传入参数进行多数据源动态切换的更多相关文章

  1. springboot多数据源动态切换和自定义mybatis分页插件

    1.配置多数据源 增加druid依赖 完整pom文件 数据源配置文件 route.datasource.driver-class-name= com.mysql.jdbc.Driver route.d ...

  2. Springboot多数据源配置--数据源动态切换

    在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...

  3. Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

    一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...

  4. Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源方法

    一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...

  5. Spring多数据源动态切换

    title: Spring多数据源动态切换 date: 2019-11-27 categories: Java Spring tags: 数据源 typora-root-url: ...... --- ...

  6. mybatis 多数据源动态切换

    笔者主要从事c#开发,近期因为项目需要,搭建了一套spring-cloud微服务框架,集成了eureka服务注册中心. gateway网关过滤.admin服务监控.auth授权体系验证,集成了redi ...

  7. 实战:Spring AOP实现多数据源动态切换

    需求背景 去年底,公司项目有一个需求中有个接口需要用到平台.算法.大数据等三个不同数据库的数据进行计算.组装以及最后的展示,当时这个需求是另一个老同事在做,我只是负责自己的部分. 直到今年回来了,这个 ...

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

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

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

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

随机推荐

  1. Spring boot Sample 009之spring-boot-web-thymeleaf

    一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 spring boot 整合thymeleaf模板开发web项目 三.步骤 3.1.点击File -> New Pro ...

  2. (linux)Centos 7 xfsdump文件系统的备份和恢复

         XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据.xfsdump 按inode顺序备份一个XFS文件系统. centos7选择xfs格式作为默认文件 ...

  3. kubeadm实现k8s高可用集群环境部署与配置

    高可用架构 k8s集群的高可用实际是k8s各核心组件的高可用,这里使用主备模式,架构如下: 主备模式高可用架构说明: 核心组件 高可用模式 高可用实现方式 apiserver 主备 keepalive ...

  4. jchdl - RTL实例 - AndAnd

    https://mp.weixin.qq.com/s/JhUB3M1WhjAyUrN1HPIPTA   AndAnd是三输入与门模块,输出为相与的结果.   参考链接 https://github.c ...

  5. QTI EAS学习之find_energy_efficient_cpu

    Energy Awareness Scheduler是由ARM和Linaro开发的新的linux kernel调度器. 原先CFS调度器是基于policy进行调度,并有不同的吞吐量.例如,有一个新的t ...

  6. Java实现 蓝桥杯 算法提高 套正方形(暴力)

    试题 算法提高 套正方形 问题描述 给定正方形边长width,如图按规律输出层层嵌套的正方形图形. 注意,为让选手方便观看,下图和样例输出均使用""代替空格,请选手输出的时候使用空 ...

  7. Java实现 蓝桥杯 基础练习 特殊的数字

    基础练习 特殊的数字 时间限制:1.0s 内存限制:512.0MB 提交此题 锦囊1 锦囊2 问题描述 153是一个非常特殊的数,它等于它的每位数字的立方和,即153=111+555+333.编程求所 ...

  8. java矩形的关系

    在编写图形界面软件的时候,经常会遇到处理两个矩形的关系. 如图[1.jpg]所示,矩形的交集指的是:两个矩形重叠区的矩形,当然也可能不存在(参看[2.jpg]). 两个矩形的并集指的是:能包含这两个矩 ...

  9. java实现第七届蓝桥杯煤球数量

    煤球数量 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), - 如果一共有100层,共有多少个煤 ...

  10. FTP配置多用户多目录多权限

    环境介绍 根据开发的需求 要求创建FTP服务器,把前端和后端分开用不同的FTP账号 系统环境 centos 7.4 selinux 关闭 防火墙关闭 安装FTP 很简单就一条命令 yum instal ...