Spring Boot 实现数据源动态切换的最佳姿势!
创作时间:
作者:
@小白创作中心
Spring Boot 实现数据源动态切换的最佳姿势!
引用
CSDN
1.
https://blog.csdn.net/weixin_45334346/article/details/145460785
在Spring Boot项目中,有时需要根据不同的业务场景切换不同的数据源。本文将详细介绍如何实现数据源的动态切换,包括数据库准备、工程环境配置以及动态数据源的具体实现方法。
2.1、数据库准备
首先,我们需要创建两个数据库:
- db_test_1
- db_test_2
在db_test_1数据库中创建一张用户表,脚本如下:
在db_test_2数据库中创建另一张账户表,脚本如下:
2.2、工程环境准备
在pom.xml文件中添加相关的依赖包,示例如下:
<!--spring boot核心-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--spring boot 测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--aspectj 注解代理-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
2.3、编写动态数据源
2.3.1、创建动态数据源服务类
首先,创建一个DynamicDataSource类,并继承AbstractRoutingDataSource抽象类,同时重写determineCurrentLookupKey()方法,代码示例如下:
2.3.2、创建动态数据源缓存类
创建一个DataSourceContextHolder类,用于缓存数据源,同时需要确保线程环境下安全
package com.example.dynamic.datasource.config;
public class DataSourceContextHolder {
/**
* 设置线程独立变量,用于存储数据源唯一标记
*/
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceKey(String key) {
contextHolder.set(key);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
}
热门推荐
百年古堡何以焕发新光彩?看皇城相府的文旅兴村之路
一二三年级中秋节诗句
激光脱毛能坚持几年
激光美容自我护理早知道
二至丸,在寒冷的冬季帮我们调养身体
如何分析香港股票市场的整体趋势?这种分析对投资决策有何指导意义?
女子吃完险丧命!真凶原来是它!很多人爱吃……
大连海事大学和太原理工大学哪个好?谁排名高
牙肉萎缩会长回来吗?5大萎缩原因及预防牙龈萎缩可以这样做!
搬运工安全培训手册:从基本知识到实战技巧
肺炎住院学平险:为大学生提供专属医疗保障
生脉饮的5个临床应用,一文总结
自动化测试工程师的工作内容与职责
电梯突然下坠,如何紧急应对与自救?
电梯失控时跳跃能减轻冲击力吗?揭秘背后的真相
“司马昭之心,路人皆知”的深层含义
PCF8574 I2C扩展器: 引脚电路图、中文资料及使用方法详解
社会现象观察:为什么想逃离父母?理由因人而异,各有各的想法
网购拆了包装是否可以无条件退货
二郎神知识大全
公益劳动的心得体会
玄机若森:中国动画公司的双雄对决
斯坦福锁相放大器的相位敏感检测原理
短剧中的情感共鸣:一部心灵的镜子
鹅肝的功效与作用及禁忌有哪些?
交通信号灯的颜色及其法律意义
愿景是什么意思
如何组建专业的施工团队
循证医学在治疗方面的应用
两地分居的中年女人:生活与情感的挑战