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();
}
}
热门推荐
晶体植入手术的危害及后遗症,以及预防措施
前后院散水围墙纠纷的法律问题研究
尼群地平的药理学和药物相互作用
7000元打造高性价比个人电脑:硬件选购全面指南
控制手机使用时间,提高生活质量(有效限制手机使用的方法及技巧)
揭秘债务纠纷中老赖转移财产常有招数:内附解决方法
自残的孩子要如何疏导?家长多关注抑郁的孩子-优艺墨堂心理咨询
“漱石枕流”:关于修辞手法“词语误用”
探究中国传统丧葬习俗“头七”的意义与计算方法
《人民的名义》高育良为何当不了省长?这几点就完败
如何查到原神角色数据库:使用官方资源、浏览玩家社区、利用第三方工具
百日冲刺:高考作文如何引用名言警句
“诗和远方”之内江——一座文化之城的文旅融合探索之路
长期不吃主食对身体会有哪些不良影响?
刑事案件一定留案底吗?答案并非绝对
尿素软膏与乳膏,有什么不同之处?
莫名流泪是为何?谨防小病转大病!
选购高性价比骨传导耳机指南:品牌、音质、防水全面解析
百花山风景区自驾游:畅享自然美景的完美路线推荐
浅谈商品期权市场平仓操作盈亏估算方法
十三香的成分分析与健康价值
小六壬入门基础知识教程
利用圆上两点和圆半径求解圆心坐标
智能消费系统:未来商业的新引擎
随身WiFi通过USB连接路由器共享网络 扩展网络覆盖范围
UI vs UX:深入理解设计的核心要素
利用“消费券”套现,获利3000元-3万余元,判了
Kcal(大卡)和kj(千焦)有什么区别?如何换算?
红楼梦中贾府为何修建大观园?开销是何来源?
如何评估和选择合适的散热风扇:从产品角度谈需求匹配与技术革新