动态数据源dynamic-spring-boot-starter

将数据库相关依赖引入

 		<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.4.1</version></dependency>

application.yml配置文件(!!!不要配错datasource)

spring:datasource:dynamic:enabled: true #启用动态数据源,默认trueprimary: db1 #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源grace-destroy: false #是否优雅关闭数据源,默认为false,设置为true时,关闭数据源时如果数据源中还存在活跃连接,至多等待10s后强制关闭datasource: #这个还有一个datasource属性,不要丢了db1:driver-class-name:  com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: rootdb2:driver-class-name:  com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: root

动态切换数据源

有两种情况:

  • 1、不同访问的用户需要连接不同的数据源,但一个用户只使用到一个数据源
  • 2、一个用户需要同时使用不同的数据源,不同的业务逻辑操作不同的数据源

第一种情况,假设每个用户有唯一的省份,每个省份又有对应的数据库,用户在发送请求时携带省份唯一标识,根据省份标识来连接对应的数据源。

  • 将省份标识作为数据源名称,如同上面配置文件的db1,db2
  • 在用户登录时获取到其携带的省份标识,并将其保存到ThreadLocal中,登录过期/注销时清除
DynamicDataSourceContextHolder.push(获取到的数据源标识);//保存到ThreadLocal
DynamicDataSourceContextHolder.peek(db);//从ThreadLocal获取不删除
DynamicDataSourceContextHolder.poll(db);//从ThreadLocal获取数据,并删除该数据
DynamicDataSourceContextHolder.peek(db);//从ThreadLocal中删除

DynamicDataSourceContextHolder是Dynamic组件提供的工具,底层是ThreadLocal里维护了一个Deque双向队列,然后数据存放在队列中。自己直接用Thread提供的set,get,remove方法是一样的效果。

  • dynamic会自动获取ThreadLocal中的省份标识,并自动查找连接对应的数据源

第二种情况,一个用户需要处理多个数据源的数据
Dynamic提供了 @DS("数据源名称")注解,该注解可以作用在方法上,类上,接口上
对于某个接口、类、方法操作的是哪个数据源,直接使用@DS注解声明对应的数据源就行了
示例:在调用getName方法时,就会查询db1数据源

 @DS("db1")public String getName(String id) {return dynamicMapper.queryName(id);}

注:使用ThreadLocal的方式更灵活,适用于复杂的情况,但使用后一定要清除ThreadLocal中的数据,否则会出现线程安全问题和内存泄漏问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

满意度调研需要注意什么

本文由群狼调研&#xff08;长沙食堂满意度调查&#xff09;出品&#xff0c;欢迎转载&#xff0c;请注明出处。满意度调研是一种市场调查方法&#xff0c;用于了解顾客对产品或服务的满意程度。通过满意度调研&#xff0c;企业可以找到影响顾客满意度的关键因素&#xff0c;以…

技术变革下职业危机

方向一&#xff1a;技术变革 1.人工智能&#xff08;AI&#xff09;&#xff1a;AI技术的快速发展正在改变各个行业。AI在医疗诊断、金融分析、客户服务以及物流管理等方面都有广泛应用&#xff0c;提高了效率和准确性。但同时也引发了一些道德和道德问题&#xff0c;比如隐私…

Java 值传递详解

形参&实参 方法的定义可能会用到 参数&#xff08;有参的方法&#xff09;&#xff0c;参数在程序语言中分为&#xff1a; 实参&#xff08;实际参数&#xff0c;Arguments&#xff09;&#xff1a;用于传递给函数/方法的参数&#xff0c;必须有确定的值。形参&#xff0…

玩法与画面全面升级,艾尔莎H311-PRO和你玩转《如龙8:无尽财富》

作为经典的日系开放式世界游戏系列&#xff0c;《如龙》至今已经推出了有十多部作品&#xff0c;它凭借着经典的日式RPG玩法吸引了不少忠实粉丝。早在2022年9月的时候&#xff0c;世嘉就已经公布了最新的正统续作《如龙8》&#xff0c;而在经历了一年半的等待以后&#xff0c;我…

jvs-rules(规则引擎)1.23功能更新说明,新增SQL变量、数据源等

规则引擎更新功能 新增: 1、新增SQL变量&#xff1a; SQL变量通常指的是在执行SQL查询时使用的动态变量。这些变量允许在查询中注入或更改某些值&#xff0c;以便根据不同的条件或输入执行不同的查询。 1.1 新增自定义SQL语言进行数据查询&#xff1b; 用户可以使用自定义的…

强化学习12——策略梯度算法学习

Q-learning、DQN算法是基于价值的算法&#xff0c;通过学习值函数、根据值函数导出策略&#xff1b;而基于策略的算法&#xff0c;是直接显示地学习目标策略&#xff0c;策略梯度算法就是基于策略的算法。 策略梯度介绍 将策略描述为带有参数 θ \theta θ 的连续函数&#…

Android签名 (四) 实践 | INSTALL_PARSE_FAILED_NO_CERTIFICATES

1. 问题描述 最近在安装一个apk时出现下面的报错&#xff1a; adb: failed to install JackDemo.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Scanning Failed.: No signature found in package of version 2 or newer for package com.jack.demo] 安装环境&#xf…

Pycharm运行提示(运行‘Python测试(00.py内)‘(u)

为什么有时候我在pycharm中运行代码会出现图片中的问题&#xff1f; 我们该如何改过来&#xff1f; 很简单 点击文件-设置 点击Python集成工具&#xff0c;在默认测试运行程序里修改为Unittest即可 再次运行代码就会显示正常的运行 你的pycharm可能是英文 如何英文变中文&…

鸿蒙APP的应用场景

鸿蒙APP可以用于多种场合和设备类型&#xff0c;这是鸿蒙系统的分布式能力和多终端适配的优势。以下是一些鸿蒙APP的应用场景&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.智能手机和平板电脑&am…

开源:两个免费的年会抽奖项目

前言 年会抽奖项目平常基本不用&#xff0c;只有到年终才会排上用场。开发的时长也不会给太久&#xff0c;而且也只是自家公司内部使用的&#xff0c;所以不需要部署&#xff0c;数据库后端甚至都可以省略&#xff1b;然后我就找了个开源的 符合我要求的年会抽奖项目进行二次开…

CSS 图片遮罩学习小节

概念&#xff1a;-webkit-mask-image是一项用于制作镂空图形和图形遮罩效果的CSS样式属性。 -webkit-mask-image 的值既可以是渐变色也可以是图片地址。 -webkit-mask-image 的起源很早&#xff0c;但兼容性不好&#xff0c;因此用途并不广泛。 效果如下&#xff1a; 底图&…

Spring Security 6 学习-1

什么是 Spring Security Spring Security文档 Spring Security中文文档 Spring Security 是 Spring 家族中的安全型开发框架&#xff0c;主要解决三大方面问题&#xff1a;认证&#xff08;你是谁&#xff09;、授权&#xff08;你能干什么&#xff09;、常见攻击保护&#xff…

深度强化学习Task3:A2C、A3C算法

本篇博客是本人参加Datawhale组队学习第三次任务的笔记 【教程地址】 文章目录 Actor-Critic 算法提出的动机Q Actor-Critic 算法A2C 与 A3C 算法广义优势估计A3C实现建立Actor和Critic网络定义智能体定义环境训练利用JoyRL实现多进程 练习总结 Actor-Critic 算法提出的动机 蒙…

Tableau1 安装基础知识

参考内容&#xff1a; 戴师兄-戴你玩转数据分析菜菜菊花酱数据分析课程 1 安装注意事项 若下次打开发现软件损坏&#xff0c;可以重新安装&#xff1b;后期激活码可以去淘宝上购买&#xff08;选择1key两机&#xff09;&#xff1b;若买了1key1机的密钥&#xff0c;需要在两台…

C#的WPF使用OFFICE库播放PPT

这里所说的是将PPT的播放嵌入到自己的程序中,用代码控制PPT的播放。感兴趣的朋友可以了解一下,代码可以【下载】 目录 1、播放PPT 2、将PPT播放窗口嵌入自己的程序 3、移动及缩放被嵌入的窗口 4、关闭演示中的PPT 5、获取系统桌面的句柄 6、PPT嵌出控件 7、查找播放窗…

深度学习记录--mini-batch gradient descent

batch vs mini-batch gradient descent batch&#xff1a;段&#xff0c;块 与传统的batch梯度下降不同&#xff0c;mini-batch gradient descent将数据分成多个子集&#xff0c;分别进行处理&#xff0c;在数据量非常巨大的情况下&#xff0c;这样处理可以及时进行梯度下降&…

volatile是如何保证线程的可见性和有序性

volatile 是 Java 中的关键字&#xff0c;用于修饰变量。使用 volatile 可以保证变量在多线程环境下的可见性和有序性。下面解释一下 volatile 是如何实现这两个特性的&#xff1a; 可见性&#xff1a; 当一个变量被声明为 volatile 时&#xff0c;如果一个线程修改了这个变量的…

力扣精选算法100题——在排序数组中查找元素的第一个和最后一个位置(二分查找专题)

目录 第一步&#xff1a;了解题意 第二步&#xff1a;算法原理 &#x1f6a9;查找区间左端点值 ❗处理细节 循环条件&#xff1a; 求中点 &#x1f6a9;查找区间右端点值 ❗处理细节 循环条件 求中点 &#x1f6a9;总结 第三步&#xff1a;代码实现 第四步:总结模…

OpenHarmony 鸿蒙使用指南——概述

简介 OpenHarmony采用多内核&#xff08;Linux内核或者LiteOS&#xff09;设计&#xff0c;支持系统在不同资源容量的设备部署。当相同的硬件部署不同内核时&#xff0c;如何能够让设备驱动程序在不同内核间平滑迁移&#xff0c;消除驱动代码移植适配和维护的负担&#xff0c;…

npm官方注册表和淘宝镜像切换

1.切换到淘宝镜像 加快npm包的下载速度&#xff0c; //已失效 //npm config set registry https://registry.npm.taobao.org/ npm config set registry https://registry.npmmirror.com这会将npm的注册表设置为淘宝镜像 查看&#xff1a; npm config get registry如果返回的…