SpringBoot多数据源配置

2023-11-17

  Druid 可以说是国内使用最广泛的数据源连接池产品

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.17</version>
</dependency>

application.yml配置

spring:
  datasource:
    pay:
      username: root
      password: root
      host: 192.168.37.133:3306
      jdbc-url: jdbc:mysql://${spring.datasource.master.host}/${spring.datasource.master.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false
      schema-name: dlsms
    order:
      username: root
      password: root
      host: 192.168.37.134:3306
      jdbc-url: jdbc:mysql://${spring.datasource.slave.host}/${spring.datasource.slave.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false
      schema-name: dlsms

配置数据源和事务管理

import net.test.project.constants.DataSourceKey;

import com.alibaba.druid.pool.DruidDataSource;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;


@MapperScan({"net.test.project.dao.mapper.*"})
@Configuration
public class DataSourceProxyConfig {

	/**
	 * 配置默认数据源
	 * @return
	 */
    @Bean(name = "originOrder", initMethod = "init") // 声明其为Bean实例
	@ConfigurationProperties(prefix = "spring.datasource.order")
	public DataSource dataSourceMaster() {
		return new DruidDataSource();
	}

    @Bean(name = "originStorage", initMethod = "init") // 声明其为Bean实例
	@ConfigurationProperties(prefix = "spring.datasource.storage")
	public DataSource dataSourceStorage() {
		return new DruidDataSource();
	}

    @Bean(name = "originPay", initMethod = "init") // 声明其为Bean实例
	@ConfigurationProperties(prefix = "spring.datasource.pay")
	public DataSource dataSourcePay() {
		return new DruidDataSource();
	}

	/**
	 * 设置多数据源,配置动态路由数据源
	 * @return
	 */
	@Bean("dynamicDataSource")
	public DataSource dynamicDataSource(@Qualifier("originOrder") DataSource dataSourceOrder,
			@Qualifier("originStorage") DataSource dataSourceStorage,
			@Qualifier("originPay") DataSource dataSourcePay) {

		DynamicDataSource dynamicRoutingDataSource = new DynamicDataSource();

		Map<Object, Object> dataSourceMap = new HashMap<>(3);
		dataSourceMap.put(DataSourceKey.ORDER.name(), dataSourceOrder);
		dataSourceMap.put(DataSourceKey.STORAGE.name(), dataSourceStorage);
		dataSourceMap.put(DataSourceKey.PAY.name(), dataSourcePay);
        //设置默认
		dynamicRoutingDataSource.setDefaultTargetDataSource(dataSourceOrder);
		dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);

		return dynamicRoutingDataSource;
	}

	/**
	 * 设置会话工厂
	 *
	 * @return
	 * @throws Exception
	 */
	@Bean(name="sqlSessionFactory")
	public SqlSessionFactoryBean sqlSessionFactoryBean(
			@Qualifier("dynamicDataSource") DataSource dataSource) {
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource);
		return sqlSessionFactoryBean;
	}

	/**
	 * 配置事务管理器
	 *
	 * @return
	 */
	@Bean(name = "transactionManager")
	public PlatformTransactionManager transactionManager(@Qualifier("originOrder") DataSource dataSourceOrder,
			@Qualifier("originStorage") DataSource dataSourceStorage,
			@Qualifier("originPay") DataSource dataSourcePay) {
		return new DataSourceTransactionManager(dynamicDataSource(dataSourceOrder, dataSourceStorage, dataSourcePay));
	}
}

实现选择目标数据源

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {
    /**
     * 取得当前使用哪个数据源
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceContextHolder.getDataSourceType();
    }
}

切换数据源

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 数据源切换处理
 * 
 */
public class DynamicDataSourceContextHolder
{
    public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);

    /**
     * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
     *  所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
     */
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    /**
     * 设置数据源的变量
     */
    public static void setDataSourceType(String dsType)
    {
        log.info("切换到{}数据源", dsType);
        CONTEXT_HOLDER.set(dsType);
    }

    /**
     * 获得数据源的变量
     */
    public static String getDataSourceType()
    {
        return CONTEXT_HOLDER.get();
    }

    /**
     * 清空数据源变量
     */
    public static void clearDataSourceType()
    {
        CONTEXT_HOLDER.remove();
    }
}

如何使用

DynamicDataSourceContextHolder.setDataSourceType(DataSourceKey.ORDER);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot多数据源配置 的相关文章

随机推荐

  • DJANGO增删改查

    https www cnblogs com yuanlianghong p 10987877 html 一 Django的工作流 1 用户通过浏览器输入相应的 URL 发起 HTTP 请求 一般是 GET POST 2 Django 接受到
  • 微信小程序:初识微信小程序和前端

    一 前期准备工作 1 申请开发微信小程序 登录微信公众平台 gt 点击 小程序 gt 点击 前往注册 gt 注册成功即可 2 下载微信开发者工具 小程序文档 gt 工具中的下载 gt 下载自己需要的版本 3 在开发者工具中创建项目 这个当中
  • RabbitMQ的高级特性

    RabbitMQ的高级特性 在项目中 有一些无需即时返回且耗时的操作 我们可以将其提取出来 做异步处理 从而节省服务器的请求响应时间 从而提高系统的吞吐量 这就需要使用到MQ 而常见的RabbitMQ就是重中之重 之前说了他的几个常见的用处
  • WebSocket 的使用,和客户端断电,服务器检测断开连接

    WebSocket 的使用 和客户端断电 服务器检测断开连接 服务器用WebSocketServlet 实例化自定义的MessageInbound web xml中配置socket
  • ext4 buddy块分配算法源码剖析

    概述 ext4 buddy块分配算法的函数是ext4 mb regular allocator 阅读本文之前需要先看下ext4 mballoc之buddy算法 nginux的博客 CSDN博客 ext4 mb regular allocat
  • YoloV8改进策略:轻量级的CloFormer助力Yolov8在速度和精度上实现双双提升

    文章目录 摘要 论文翻译 摘要 1 简介 2 相关工作 3 方法 3 1 总体架构 3 2 AttnConv 3 3 不同的局部感知方式 3 4 实现细节 4 实验 4 1 ImageNet1K分类 4 2 COCO目标检测 4 3 ADE
  • C 实现Window/DOS 键盘监听事件

    今天是重新复习C语言实现的第一天 今天想编写C 对Windwos Dos 键盘事件的学习 但是我在安装Visual Studio 2022 没有安装MFC 框架 今天记录下VS 追加 MFC框架 Visual Studio 2022 追加M
  • 基于opencv3的人脸检测

    目前opencv3中已经有人脸检测的类了 只要调用函数库的类就行 该程序需要两个xml文件 分别是haarcascade frontalface alt xml和haarcascade eye tree eyeglasses xml 它们分
  • php安装部署及优化

    目录 PHP源码编译 php启动与nginx整合 php功能模块的扩展 php添加memcache功能模块 构建Nginx高速缓存 tomcat结合memcache PHP源码编译 https www php net 下载软件包 安装解压工
  • 【下资源】全网独家首发2014传智播客三层架构及餐饮管理系统项目

    核心技术课程 三层架构原理 手写三层 自己动手代码生成器 商业级代码生成器 三层架构应用案例 NPOI MD5 WinForm高级应用 常用WinForm相关设计模式 数据库设计工具PowerDesigner高级应用 源代码管理 团队配合做
  • 【更新中…】Matlab simulink建模与仿真

    本文为学习笔记 视频来源 https www bilibili com video BV1L7411a7uL Matlab simulink建模与仿真 1 初始simulink 1 1 simulink简介 1 1 1 matlab与sim
  • error: static assertion failed: Type is not registered, please use the Q_DECLARE_METATYPE macro to m

    error static assertion failed Type is not registered please use the Q DECLARE METATYPE macro to m 解决方案 报错信息如下 调用了类的静态函数导
  • 【docker】CMD ENTRYPOINT 区别 终极解读!

    昨天用Dockerfile来启动mongodb的集群 启动参数 replSet死活没执行 最后就决定研究一哈cmd和entrypoint 但是上网看了一些资料个人觉得讲的不好 还是没有说出根本的东西 决定自己研究并且整理一哈 首先上dock
  • Linux系统下使用socat将串口映射到TCP服务器端口

    首先需要安装socat 安装方法即是 apt get install socat 或 yum install socat 然后使用以下命令进行映射 socat TCP LISTEN 8899 fork reuseaddr FILE dev
  • 华为OD机试 - 可以组成网络的服务器(Java)

    题目描述 在一个机房中 服务器的位置标识在 n m 的整数矩阵网格中 1 表示单元格上有服务器 0 表示没有 如果两台服务器位于同一行或者同一列中紧邻的位置 则认为它们之间可以组成一个局域网 请你统计机房中最大的局域网包含的服务器个数 输入
  • Java进阶知识

    今天分享有关java方面的知识 Paradigm 除了Java语言基础 通常在每种语言中还有很多paradigm 这些paradigm往往是衡量老鸟和新手的地方 比如函数命名 异常处理 泛型等等 下面用异常处理的两种类型来说明 笔者见过很多
  • JVM知识点

    JVM知识点 概念 java内存模型 线程私有 内存溢出和内存泄漏 线程共享区域 存在GC 类加载 类加载机制 双亲委派模型 垃圾回收GC 概念 如何判断一个对象是垃圾 有两种算法 1 引用计数算法 2 可达性分析算法 JVM采取 垃圾回收
  • 最大连续子序列和,以及开始、结束下标(Java)

    对一个有n个元素的数组 求最大的连续子数组的和 并求其开始 结束下标 数组的元素必然有正数也有负数才有意义 如果全是正数 那最大的子数组就是本身 如果全部为负数 那最大子数组就是空数组 例如下面的数组 其最大子数组序列和为187 子数组为X
  • k8s之nginx-ingress做tcp或udp的4层网络负载

    检查nginx ingress是否开启tcp udp转发 test test02 ingress kubectl get pod n ingress nginx o yaml grep i configmap configmap POD N
  • SpringBoot多数据源配置

    Druid 可以说是国内使用最广泛的数据源连接池产品