ThreadLocal 切换数据源的使用

ThreadLocal使用不规范,上线两行泪 Java中的ThreadLocal是一种用于在多线程环境中存储线程局部变量的机制,它为每个线程都提供了独立的变量副本,从而避免了线程之间的竞争条件。事实上,ThreadLocal的工作原理是在每个线程中创建一个独立的变量副本,并且每个线程只能访问自己的副本。进一步,ThreaLocal可以在当前线程中独立的保存信息,这样就方便同一个线程的其他方法获取到该信息。因此,ThreaLocal的一个最广泛的使用场景就是将信息保存,从而方便后续方法直接从线程中获取。 阅读详情

百度安全验证https://baijiahao.baidu.com/s?id=1651506162577833204&wfr=spider&for=pc

前言:首先说下什么是多数据源?无论是在学时中还是实际开发中,很多项目都是单数据源,比如连接mysql。但是还是有一些项目需要多数据源的。

①、项目中存储的数据量很大,一个服务器扛不住,需要将一部分数据存储在另外一个服务器里,然而我们还要每天去访问这些存储的数据。

②、项目与其他项目对接,需要连接另外一个项目的数据库(这里可能有人会提议使用API,但这是相对于第三方公司,人家不会把数据库信息暴露给你的,所以才提供的api。)

在网上百度,发现多数据源切换都会使用到ThreadLocal,如图:

多数据源

这是小编在开发多数据源中的代码。相信没有使用过ThreadLocal的伙伴,看到这段代码肯定很陌生。先解释下ThreadLocal是什么?ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的可见范围限制在同一个线程内。更直白点讲,ThreadLocal可以理解为将对象的作用范围限制在一个线程上下文中,使得变量的作用域为“线程级”。ThreadLocal将变量绑定在线程上,在一个线程周期内,无论“你身处何地”,只需通过其提供的get方法就可轻松获取到对象。极大地提高了对于“线程级变量”的访问便利性。

查看ThreadLocal的源码

ThreadLocal的源码

可以看到内部有一个ThreadLocalMap,每次都会获取当前线程,在从当前线程中插入或拿取值,这样就保证了只能当前线程能插入和拿取自己的值,其他线程是访问不到的。这样也就避免了传参问题。(脑补下,比如一个值好几个方法都要用到,普通的做法就是一个一个方法传递下去,但是使用ThreadLocal后,调用get方法就可以拿到参数值了,是不是很方便),在多数据源中,会频繁的调用数据库,采用传参来决定使用什么数据源肯定是不可取的,采用ThreadLocal完美解决数据库切换问题。缺点就是以空间换时间的方式(与synchronized相反),以耗费内存为代价,但是大大减少了线程同步(如synchronized)所带来性能消耗以及减少了线程并发控制的复杂度。

总结:

ThreadLocal是什么?它就是线程本地变量,保证每个线程都能设置和拿到自己的值,其他线程被拒之门外。ThreadLocal解决传参问题。ThreadLocal以耗费内存为代价。

SpringBoot 自定义注解来实现动态切换数据源 / 初始化数据源@Override@Inherited@Pointcut(“@annotation(包名.aop.DataSource)”) public void@Pointcut 注解定义了一个切点,名称为 dynamicDataSource。@annotation(包名.aop.DataSource) 表示这个切点匹配所有带有 @DataSource 注解的方法。 阅读详情

相关推荐

AAAI2024最佳解读|FontDiffuser One-Shot Font Generation via Denoising Diffusion with Multi-Scal

本文提出了一种名为FontDiffuser的基于扩散的单次字体生成方法,旨在通过去噪扩散模型生成模仿参考图像风格的字体,同时保留源图像的内容。尽管现有的字体生成方法在性能上取得了一定的进展,但在处理复杂字符和大风格变化时仍面临挑战。FontDiffuser通过引入多尺度内容聚合(MCA)模块,有效结合不同尺度的全局和局部内容线索,从而增强复杂字符的笔画保留能力。此外,文章还提出了一种风格对比细化(SCR)模块,用于风格表示学习,利用风格提取器从图像中分离风格,并通过精心设计的风格对比损失来监督扩散模型。

haimianxiaobao11的博客 1189

1.在web环境中使用ThreadLocal出现数据错乱是什么原因导致的?

解决思路:

weixin_63860651的博客 728

RK3588设备树调试实战:解决NPU不加载、USB3.0识别异常与DP显示问题

本文深入探讨了RK3588设备树调试中的三大典型问题:NPU不加载、USB3.0识别异常与DP显示问题。通过详细的问题定位步骤、关键设备树修改和调试技巧,帮助开发者快速解决硬件适配中的挑战,提升RK3588平台的开发效率。

weixin_30576827的博客 474

在web环境下中使用ThreadLocal出现数据错乱问题及解决

threadlocal在web使用下使用

qq_40822221的博客 709

NXP S32K1 SPI驱动实战:从配置到DMA传输的完整流程解析

本文深入解析了NXP S32K1系列MCU的SPI驱动开发全流程。基于S32 Design Studio环境,详细阐述了从引脚配置、LPSPI模块初始化,到实现阻塞、中断及DMA三种传输模式的实战代码与配置要点。文章重点剖析了DMA传输的配置细节与性能优化,旨在帮助开发者构建高效、稳定的嵌入式SPI通信,并提供了SPI Flash驱动的综合案例。

blue42的博客 712

PLC1200使用CB1241RS485通讯模块做从站进行Modbus Rtu通信

添加新设备(PLC)->设备和网络管理->点击PLC->看到硬件目录选择通信板->点到点->CB1241(RS485)->看到6ES7241-1CH30-1XB0选择添加,如图。指向Modbus保持寄存器数据块的指针 我这里指向了自定义的DB块数据中一个INT数组。在通信->通信处理模块->MODBUS(选择不带RTU的通信指令块)注意:接线时,TRA接485调试模块的B- TRB接调试模块的A+组态后的硬件标识符 270 对应自己组态后自动生成的。1:事务完成,且无任何错误。波特率对应自己使用的。

swmyaopeng的博客 2万+

ThreadLocal&&Reference

序言 目前ThreadLocal使用场景最多的就是多数据源的切换了.我们在使用ThreadLocal在不同线程之间切换数据源的时候要其实有很多知识点需要注意cuiyaonan2000@163.com 线程的状态 线程入门的知识,但是在后续的设计中会应用到cuiyaonan2000@163.com 系统线程的状态 新建(NEW) 就绪(RUNNABLE) 运行(RUNNING) 阻塞(BLOCKING): sleep,wating,blocking 死亡(DEAD) Java线程状态

难得糊涂 861

新手必看:LiteRadio 2c SE遥控器从开箱到飞行的完整指南(附常见问题解答)

本文为新手提供LiteRadio 2c SE遥控器的完整使用指南,涵盖从开箱到首飞的20个关键步骤。详细介绍了遥控器的功能设置、与无人机的对频技巧以及首飞注意事项,帮助用户快速掌握飞行控制,避免常见错误。特别适合无人机初学者阅读。

weixin_29209801的博客 378

ThreadLocal线程本地存储------数据混乱的问题

问题描述:我的项目是java web项目,使用ThreadLocal用于存储关于用户相关性信息,但是发现有出现混乱的情况。明明不是这个用户的数据,出现在了这个用户这里。而且我还在每次请求之后的aspect切面,的finally语句块中使用ThreadLocal的remove方法来清除ThreadLocal中存储的数据。 上面的问题查找了很久:发现了以下 1、ThreadLocal简单说明。T...

cherry_chenrui的博客 3925

锐捷交换机路由器配置全攻略:从基础命令到高级功能(附常用命令速查表)

本文提供锐捷交换机路由器配置全攻略,涵盖从基础命令到高级功能的详细指南,包括VLAN划分、DHCP配置、链路聚合等实用技巧,并附常用命令速查表,帮助网络管理员快速掌握锐捷设备运维。

weixin_29285605的博客 518

时序定江山,功耗写风骨——解读时序库lib文件的奥义【芯片设计 lib文件】

lib库,全称liberty library format file:它是Liberty时序文件的简称,使用 Liberty 语法来编写。它可以通过library compiler/dc转换成.db文件(database),供synopsis家的DC和PT使用,也可以通过spyglass的library compiler来生成sglib文件,供spyglass使用。他们是等价的,但db文件是二进制格式,人类不可读。

LogicYarn的博客 2601

面试官问你为什么做多数据源切换时,会使用到ThreadLocal

前言:首先说下什么是多数据源?无论是在学时中还是实际开发中,很多项目都是单数据源,比如连接mysql。但是还是有一些项目需要多数据源的。①、项目中存储的数据量很大,一个服务器扛不住,需要讲一部分数据存储在另外一个服务器里,然而我们还要每天去访问这些存储的数据。②、项目与其他项目对接,需要连接另外一个项目的数据库(这里可能有...

小屁孩大帅-保密的博客 44

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

使用SpringBoot 实现动态切换数据源的可行性方案

来移除当前线程已设置的数据源。这两个方法,翻看源码我们会发现其实就是在使用ThreadLocal时使用了栈,这样的好处就是能使用多数据源嵌套,这里就不带大家实现了,有兴趣的小伙伴可以看看Mybatis-plus中动态数据源的源码。进行目标数据源的重新赋值。通过配置类,将配置文件中的配置的数据库信息转换成datasource,并添加到DynamicDataSource中,同时通过@Bean将DynamicDataSource注入Spring中进行管理,后期在进行动态数据源添加时,会用到。

zy_zeros的博客 1023

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SpringBoot+ThreadLocal+AbstractRoutingDataSource实现动态切换数据源

上述提到了ThreadLocal和AbstractRoutingDataSource,我们来对其进行简单介绍下。:想必大家必不会陌生,全称:thread local variable。主要是为解决多线程时由于并发而产生数据不一致问题。ThreadLocal为每个线程提供变量副本,确保每个线程在某一时间访问到的不是同一个对象,这样做到了隔离性,增加了内存,但大大减少了线程同步时的性能消耗,减少了线程并发控制的复杂程度。ThreadLocal作用:在一个线程中共享,不同线程间隔离。

jiashn123的专栏 945

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringBoot 实现动态切换数据源

上述提到了ThreadLocal和AbstractRoutingDataSource,我们来对其进行简单介绍下。ThreadLocal:想必大家必不会陌生,全称:thread local variable。主要是为解决多线程时由于并发而产生数据不一致问题。ThreadLocal为每个线程提供变量副本,确保每个线程在某一时间访问到的不是同一个对象,这样做到了隔离性,增加了内存,但大大减少了线程同步时的性能消耗,减少了线程并发控制的复杂程度。ThreadLocal作用:在一个线程中共享,不同线程间隔离。

qq_28865843的博客 1566

通过AOP实现动态数据源切换

目录1. 自定义注解2. 创建DynamicDataSourceHolder类,存在数据源名称3. 创建DynamicDataSource类,获取数据源名称4. 创建切面类AspectDs,拦截自定义的注解5. 创建数据源配置类DataSourceConfiguration6. 在方法上添加@TargetSource 1. 自定义注解 默认值ds1,即默认数据源是ds1 import java.lang.annotation.*; @Target({ElementType.METHOD}) @Rete

Fisher3652的博客 744

浅谈使用Spring多数据源路由AbstractRoutingDatasource实现动态切换数据源

此方法给当前线程的ThreadLocal中保存新增的数据源名称A(唯一标识),可以理解成切换了数据源。在执行查询数据源操作时,要获取连接,调用AbstractRoutingDataSource 路由的getConnection()执行determineTargetDataSource()方法,进一步的this.determineCurrentLookupKey()返回当前线程ThreadLocal保存的数据源名称,所以resolvedDataSources返回了新增数据源A,从而查询操作的是数据源A。

nly19900820的博客 1822

关于线程局部变量ThreadLocal(线程数据隔离)的使用

关于线程局部变量ThreadLocal(线程数据隔离)的使用

wxhwxh2的博客 869

Springboot动态切换数据源

动态切换数据源 在springboot项目中只需一句代码即可实现多个数据源之间的切换: // 切换sqlserver数据源: DataSourceContextHolder.setDataBaseType(DataSourceEnum.SQLSERVER_DATASOURCE); ...... // 切换mysql数据源 DataSourceContextHolder.setDataBaseType(DataSourceEnum.MYSQL_DATASOURCE); 具体实现: 本实例基于spri

zhang_java_11的博客 5851

SpringBoot 实现动态切换数据源,这样做才更优雅!

登录后复制/****/@Inherited1.2.3.4.5.6.7.8.9.10.11.12.

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 1127

SpringBoot实现动态切换数据源,这样做才更优雅

这两个方法,翻看源码我们会发现其实就是在使用ThreadLocal时使用了栈,这样的好处就是能使用多数据源嵌套,这里就不带大家实现了,有兴趣的小伙伴可以看看Mybatis-plus中动态数据源的源码。上述代码已经实现了添加数据源的方法,那么我们来模拟通过从数据库表中添加数据源,然后我们通过调用加载数据源的方法将数据源添加进数据源Map中。通过执行结果,我们通过@DS也进行了数据源的切换,实现了Mybatis-plus动态切换数据源中的通过注解切换数据源的方式。来移除当前线程已设置的数据源。

jj1245_的博客 1168

mybatis动态切换|增加数据源

动态切换数据源 动态切换数据源,这些数据源是在程序启动前,已经预定义。 它的工作原理是根据AbstractRoutingDataSource这个特殊的数据源,每次在请求前设置数据源id,来达到切换数据源的目的。 DynamicRoutingDataSourceKeyHolder 我们可以通过一个ThreadLocal类来实现切换当前线程的数据源id的功能。 public class Dynamic...

dark 4055

mysql多数据源切换_Spring 多数据源动态切换实现与原理分析

一 多数据源在平常的开发过程中,我们经常会遇到对多个数据库进行读写的场景,比如说数据库主从读写分离啊,不同数据库数据读写啊,等等。二 Srping Boot 多数据源动态切换实战实现多数据源动态切换主要包含以下几步:各数据源dataSource注入配置动态数据源配置AOP切面注解实现动态切换下面就按照三个步骤来实现多数据源的动态切换了1.各数据源配置注入这一步就很平常了,就跟配置一个数据源是一样的...

weixin_29904391的博客 454
上一篇: 2020-11-10
下一篇: linux jdk 安装
ITxiaojunjun
博客等级 码龄12年 4粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值