当前位置: 首页 > news >正文

动态数据源切换

在 Java 开发中,DynamicDataSourceContextHolder.push("slave2") 通常用于 动态数据源切换 场景,是实现多数据源(如主从数据库、分库分表)切换的核心操作之一。

具体作用

DynamicDataSourceContextHolder 是动态数据源框架(如自定义实现或基于 spring-jdbc 扩展的动态数据源组件)中的上下文持有者,其核心功能是 存储当前线程使用的数据源标识(如数据源名称)。

push("slave2") 方法的作用是:
将数据源标识 slave2 存入当前线程的上下文(通常基于 ThreadLocal 实现),告诉动态数据源框架:当前线程接下来的数据库操作,使用名为 slave2 的数据源

工作原理

动态数据源的实现通常依赖以下组件:

  1. DynamicDataSource:继承自 Spring 的 AbstractRoutingDataSource,重写 determineCurrentLookupKey() 方法,从 DynamicDataSourceContextHolder 中获取当前线程的数据源标识,从而路由到对应的数据源。

  2. DynamicDataSourceContextHolder:内部维护一个 ThreadLocal<Deque<String>>(线程本地的双端队列),用于存储数据源标识。

    • push():将数据源标识入栈(添加到队列),设置当前线程的数据源。
    • pop():将数据源标识出栈,恢复上一个数据源(适用于嵌套切换场景)。
    • get():获取当前线程的数据源标识。

典型使用场景

在需要切换数据源的业务代码中,通常会结合 try-finally 确保数据源标识正确清理,避免线程复用导致的数据源混乱:

// 切换到 slave2 数据源
DynamicDataSourceContextHolder.push("slave2");
try {// 执行数据库操作(此时会使用 slave2 数据源)userMapper.selectByPrimaryKey(1);
} finally {// 清除数据源标识,恢复默认数据源DynamicDataSourceContextHolder.pop();
}

常见扩展

  • 嵌套切换:如果业务中需要临时切换到另一个数据源(如 slave2 → slave3),Deque 结构支持嵌套入栈 / 出栈,确保恢复时回到正确的上一级数据源。
  • 注解驱动:很多框架会基于此实现注解式切换(如 @DataSource("slave2")),通过 AOP 在方法执行前 push 数据源,方法执行后 pop 清理。
http://www.lryc.cn/news/595135.html

相关文章:

  • Android Jetpack系列组件之:LiveData(保姆级教程)
  • 动静态库原理与实战详解
  • Ubuntu 22 安装 ZooKeeper 3.9.3 记录
  • 【HarmonyOS】ArkUI - 声明式开发范式
  • 信息整合注意力IIA,通过双方向的轻量级注意力机制强化目标关键特征并抑制噪声,提升特征融合的有效性和空间位置信息的保留能力。
  • I2S音频的时钟
  • C/C++ 详谈结构体大小计算(内存对齐)
  • 移动端轻量级神经网络推理框架
  • 蚂蚁数科AI数据产业基地正式投产,携手苏州推进AI产业落地
  • 解决mac chrome无法打开本地网络中的内网网址的问题
  • ELN和LIMS的区别
  • Django关于ListView通用视图的理解(Cursor解释)
  • Java基础教程(010):面向对象中的this和就近原则
  • 算法训练营DAY37 第九章 动态规划 part05
  • 两个相机的视野 拼接算法
  • 【C++】stack和queue拓展学习
  • DevCon 6记录
  • 从 “能用“ 到 “好用“:中小制造企业数字化转型中的 IT 系统优化管理策略
  • 扬声器测试解决方案
  • AWS Certified Cloud Practitioner 认证考试总结
  • Centos安装最新docker以及ubuntu安装docker
  • 旋转目标检测(Rotated Object Detection)技术概述
  • ESP32-S3学习笔记<1>:ESP-IDF的安装与命令
  • 【编程语言】C、C++、C#深度对比:三种语言的演进历程与应用场景
  • Windows VS2019 编译 Apache Thrift 0.15.0
  • 倒排索引实操
  • CS231n-2017 Lecture4神经网络笔记
  • selenium爬取图书信息
  • 通信刚需小能手,devicenet转PROFINET网关兼容物流分拣自动化
  • 从cv610的demo原理看,i2c的上拉电阻为 1k