Spring boot 使用@DS 配合druid连接池切换数据源及切换数据源失效情况

news2024/11/17 0:04:09

一、导入包

<!-- dynamic-datasource -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.2.1</version>
</dependency>

二、配置yam配置文件

spring:
  datasource:
    druid:
       dynamic:
         datasource:
           master: 
            url: jdbc:mysql://192.168.1.1:3306/master?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
             username: root
             password: "123tttt@444tyMAIYUE2022"
             driver-class-name: com.mysql.cj.jdbc.Driver
           slave:
             url: jdbc:mysql://192.168.1.1:3306/slave?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
             username: root
             password: "123@444tyMAIYUE2022"
             driver-class-name: com.mysql.cj.jdbc.Driver

三、在类上或者在方法上使用@DS切换数据源

 在类或者方法上使用数据源很简单,但是需要注意会有以下几种情况会导致切换数据源失效:

1、在使用@DS的方法在调用的方法中使用了@Transactional(rollbackFor = Exception.class)开启了事务,会导致切换数据源失败

2、在方法A使用slave数据源,方法B使用master数据源,方法A使用this调用方法B,方法B会继续使用slave数据源,造成切换数据源失效 

四、问题剖析及解决方案

1、主方法开启了@Transactional导致切换数据源失效问题剖析及解决方案

        为什么开启了事务会导致切换数据源失效,首先我们需要从Spring 事务的传播机制说起

PROPATATION_REQUIRE(默认)如果当前没有事务,就创建一个事务,如果当前有事务,那就加入该事务
PROPATATION_SUPPORTS如果当前有事务,就加入该事务,没有就以非事务的方式执行
PROPATATION_MANDRTOR如果有事务就加入事务,没有就抛出异常
PROPATATION_NEW_REQURIRE新建一个事务,如果当前有事务,就挂起当前事务
PROPATATION_NOT_SUPPORTS以非事务的方式执行,如果当前存在事务,就挂起当前事务
PROPATATION_NEVER以非事务的方式执行,如果存在当前事务,就抛出异常
PROPATATION_NESTED

如果当前存在事务,就嵌套在当前事务中执行,没有就新建一个事务

Spring 默认传播机制是PROPATAION_REQUIRE,使用这个注解,会从默认创建事务的数据源中获取数据源,从源码中分析Spring 获取数据源的源码,可以直观看到,如果存在已经开启事务的数据源就使用存在事务的数据源。

解决方案:

1、在使用@DS切换数据源的主调用方法不要使用事务,去掉@Transactional 

2、如果一定要使用@Transactional标签开启事务,不要使用默认的事务传播机制,为每个方法开启一个独立的事务

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

2、 在方法A使用slave数据源,方法B使用master数据源,方法A调用方法B,方法B会继续使用slave数据源,造成切换数据源失效问题剖析及解决方案

         DS切换数据源使用了AOP切面,AOP切面使用的动态代理技术,动态代理在执行方法A时会生成一个方法A的代理对象,而调用方法B时使用的是this调用,this的指向的是源对象本身,所以方法B没有代理的对象调用,所以方法B不会进入代理。看DS AOP拦截类可以看到,只有代理的方法执行完毕后清空切换的数据源信息,这两个问题导致了方法B是没有切换数据源失效。

 解决方案:

1、(不推荐使用)在对象中注入本类对象的,使用本类对象执行方法B,不使用this调用方法B,可能会导致循环依赖问题,不推荐使用

2、方法B定义在其他类中,不使用this调用方法B,在调用方法B就会使用该类对象的代理调用

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

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

相关文章

【Flask框架】——09 视图和URL总结

目录一、创建flask项目1、安装环境2、创建项目3、启动程序4、访问项目二、flask参数说明1.初始化flask项目2.参数说明3.DEBUG调试模式三、应用程序的参数加载1.从配置对象中加载2.从配置文件中加载3.从环境变量中加载4.从Pycharm中的运行时设置环境变量的方式加载5.企业项目开发…

Flink-多流转换(合流,分流,双流join)

8 多流转换 8.1 分流 简单实现 对流三次filter算子操作实现分流 // 筛选 Mary 的浏览行为放入 MaryStream 流中DataStream<Event> MaryStream stream.filter(new FilterFunction<Event>(){Overridepublic boolean filter(Event value) throws Exception {retur…

vue-admin-template侧边栏修改成抽屉式

目录 一、修改sidebar组件 二、修改store 三、修改sidebaritem页面 四、修改navbar页面 五、修改layout 六、修改样式 一、修改sidebar组件 src—layout—components—sidebar—index.vue 把组件sidebar改成drawer <template><div :class"{ has-logo: s…

【AGC】崩溃服务flutter报缺失recordFatalException方法的问题

问题背景&#xff1a; cp反馈集成AGC-崩溃服务的flutter插件&#xff0c;使用最新的1.3.0300版本&#xff0c;出现下面错误 /Users/yin/Documents/projects/flutter/.pub-cache/hosted/pub.dartlang.org/agconnect_crash-1.3.0300/android/src/main/java/com/huawei/agconnec…

【脚本项目源码】Python制作艺术签名生成器,打造专属你的个人艺术签名

前言 本文给大家分享的是如何通过利用Python制作艺术签名生成器&#xff0c;废话不多直接开整~ 开发工具 Python版本&#xff1a; 3.6 相关模块&#xff1a; requests模块 PIL模块 PyQt5模块 环境搭建 安装Python并添加到环境变量&#xff0c;pip安装需要的相关模块即…

一个.NET的轻量级JWT库

这两天网上闲逛的时候&#xff0c;看到一个.NET的轻量级JWT库LitJWT&#xff0c;LitJWT号称主要关注性能&#xff0c;能提升至少5倍的编码/解码速度&#xff0c;以及更少的配置&#xff01; LitJWT支持的平台为netstandard 2.1或net5.0更高。 LitJWT宣传的性能对比图&#xf…

vulnhub靶机:presidential1

目录 进行靶机ip的扫描 nmap扫描开发的端口和服务信息 目录扫描 修改host文件 子域名搜集 phpmyadmin管理端登录 phpmyadmin漏洞利用 反弹shell capabilities提权 获取root权限 靶机总结 靶机下载网址&#xff1a;Presidential: 1 ~ VulnHub Kali ip&#xff1a;19…

数据分析方法-五大理论、分析框架、应用、数据分析作用

1、统计学理论 1.1 大数定量 定义&#xff1a; 指大量重复某一实验时&#xff0c;最后的频率会无限接近于事件的概率 数据的样本量越大&#xff0c;我们预测和计算的概率就越准确 数据的样本量越小&#xff0c;我们预测和计算的概率就越可能失效 举例&#xff1a; 某产品用户…

keepalived 主备使用

keepalived 主备使用 本篇主要介绍一下 keepalived 的基本的 主备使用 1.概述 什么是 keepalived呢,它是一个集群管理中 保证集群高可用的软件,防止单点故障,keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundancy Protocol&#xff0c;即虚拟路冗…

CH36X系列芯片Linux系统使用教程

一、概述 CH365是一个连接PCI总线的通用接口芯片&#xff0c;CH367/CH368是连接PCI-Express总线的通用接口芯片。支持I/O端口映射、存储器映射、扩展ROM以及中断&#xff0c;提供主动并口、SPI、I2C、GPIO等硬件接口。基于如上芯片可将PCI/PCIe总线转换为简便易用的类似于ISA总…

R语言使用Rasch模型分析学生答题能力

最近我们被客户要求撰写关于IRT的研究报告&#xff0c;包括一些图形和统计输出。几个月以来&#xff0c;我一直对序数回归与项目响应理论&#xff08;IRT&#xff09;之间的关系感兴趣。 在这篇文章中&#xff0c;我重点介绍Rasch分析。 最近&#xff0c;我花了点时间尝试理解…

今天面了个阿里拿 38K 出来的,让我见识到了基础的天花板

前言 人人都有大厂梦&#xff0c;对于程序员来说&#xff0c;BAT 为首的一线互联网公司肯定是自己的心仪对象&#xff0c;毕竟能到这些大厂工作&#xff0c;不仅薪资高待遇好&#xff0c;而且能力技术都能够得到提升&#xff0c;最关键的是还能够给自己镀上一层金&#xff0c;…

【数集项目之 MCDF】(二) 从输入端 slave_FIFO

由于slave_FIFO调用了子模块同步FIFO SCFIFO.v&#xff0c;因此首先简单介绍同步FIFO的设计。 第一节 同步FIFOSCFIFO设计 同步FIFO实体是一组存储单元&#xff0c;因此需要先用数组方式来实现 reg [DATA_WIDTH - 1 : 0] fifo_buffer[DATA_DEPTH - 1 : 0]; 其中在参数中进行…

【随机分形搜索算法】一种新的全局数值优化的适应度-距离平衡随机分形搜索算法FDB-SFS附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

模型精度再被提升,统一跨任务小样本学习算法 UPT 给出解法!

近日&#xff0c;阿里云机器学习平台PAI与华东师范大学高明教授团队、达摩院机器智能技术NLP团队合作在自然语言处理顶级会议EMNLP2022上发表统一多NLP任务的预训练增强小样本学习算法UPT&#xff08;Unified Prompt Tuning&#xff09;。这是一种面向多种NLP任务的小样本学习算…

【HMS Core】运动健康服务上传平台的健康数据,能否获取到上传设备的SN码或者唯一设备码信息

问题描述 上传平台的健康数据&#xff0c;能否获取到上传设备的SN码或者唯一设备码信息 解决方案 DeviceInfo中包含华为设备唯一标识&#xff0c;您可以通过DeviceInfo进行查看。 DeviceInfo Android API&#xff1a;https://developer.huawei.com/consumer/cn/doc/developm…

价值年薪50W的软件测试进阶学习路线,终于让我从阿里P8手里抠出来了

作为一个男人我感觉必须得做点什么来证明一下自己&#xff0c;现在我又回来了&#xff0c;准备把自己的节操准备补一下。另外给各位未来的自动化测试工程师和测试开发工程师说一句&#xff0c;别的我不清楚&#xff0c;学习编程请从一而终 咱们学习编程就挺难的&#xff0c;有…

Matplotlib学习笔记(第二章 2.14 图像教程)

2.1.4 图像教程 使用Matplotlib绘制图像的简短教程。 启动命令 首先&#xff0c;让我们开始IPython。它是对标准Python提示符的最优秀的增强&#xff0c;它与Matplotlib结合得特别好。直接在shell上启动lPython&#xff0c;或者使用Jupyter笔记本(其中IPython作为运行的内核…

为什么 Android 要采用 Binder 作为 IPC 机制?

前言 Android 系统为了安全、稳定性、内存管理等原因&#xff0c;Android 应用和系统服务都是运行在独立的进程中的&#xff0c;但系统服务与应用进程之间&#xff0c;应用进程A与应用进程B之间需要通信和数据共享的。因此&#xff0c;Android 系统需要提供一套能够高效、安全…

js 踩了正则表达式的大坑!lastIndex属性

参考文章 踩坑情景 今天一来&#xff0c;被测试测出了一个问题&#xff0c;在使用vantUI的移动端项目中&#xff0c;我虽然对用户输入的值做了去除首尾空格的操作&#xff0c;但却忘记对用户输入的空值进行错误提示&#xff0c;fine&#xff0c;我选择给表单添加rules规则&am…