Spring Boot实现多数据源连接和切换
文章目录前言一、多数据源配置与切换方案二、实现步骤1. 创建多个 DataSource 配置类2. 创建 DataSource 配置类3. 创建动态数据源路由类4. 实现 DynamicDataSource 类5. 创建 DataSourceContextHolder 来存储当前的数据源标识6. AOP 方式切换数据源7. 自定义注解来指定数据源8. 在 Service 层使用注解指定数据源总结前言在 Spring Boot 中实现多数据源连接和切换可以通过以下几种方案来实现具体取决于项目的需求、数据库的使用模式和管理的复杂性。以下是一个常见的多数据源切换的实现方案使用 AbstractRoutingDataSource 来动态选择数据源。一、多数据源配置与切换方案在多数据源场景中通常有如下步骤配置多个数据源的DataSourcebean。使用AbstractRoutingDataSource来动态切换数据源。使用ThreadLocal存储当前的数据库类型或数据源标识符。配置数据源切换的逻辑例如基于当前的用户、请求路径、服务标识等来选择不同的数据源。二、实现步骤1. 创建多个DataSource配置类首先为每个数据源创建单独的配置类通常你会在application.yml或application.properties中配置每个数据源的连接信息。spring: datasource: # 默认数据源配置 primary: url: jdbc:mysql://localhost:3306/primary_db username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 10 # 第二数据源配置 secondary: url: jdbc:mysql://localhost:3306/secondary_db username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 102. 创建DataSource配置类Configuration EnableTransactionManagement public class DataSourceConfig { Bean(name primaryDataSource) Primary ConfigurationProperties(prefix spring.datasource.primary) public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } Bean(name secondaryDataSource) ConfigurationProperties(prefix spring.datasource.secondary) public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } }3. 创建动态数据源路由类AbstractRoutingDataSource允许我们在运行时根据某些条件动态选择数据源。Configuration public class DynamicDataSourceConfig { Autowired Qualifier(primaryDataSource) private DataSource primaryDataSource; Autowired Qualifier(secondaryDataSource) private DataSource secondaryDataSource; Bean public DataSource dataSource() { // 创建一个路由数据源 DynamicDataSource dataSource new DynamicDataSource(); dataSource.setDefaultTargetDataSource(primaryDataSource); // 默认数据源 MapObject, Object targetDataSources new HashMap(); targetDataSources.put(primary, primaryDataSource); targetDataSources.put(secondary, secondaryDataSource); dataSource.setTargetDataSources(targetDataSources); return dataSource; } }4. 实现DynamicDataSource类DynamicDataSource是继承自AbstractRoutingDataSource它通过determineCurrentLookupKey()方法来动态确定当前的数据源。public class DynamicDataSource extends AbstractRoutingDataSource { // 从 ThreadLocal 获取当前的数据库标识 Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceType(); } }5. 创建DataSourceContextHolder来存储当前的数据源标识使用ThreadLocal来保持当前线程的数据库标识以便在不同的数据源之间切换。public class DataSourceContextHolder { // 使用 ThreadLocal 存储当前线程的数据源标识 private static final ThreadLocalString contextHolder new ThreadLocal(); public static void setDataSourceType(String dataSourceType) { contextHolder.set(dataSourceType); } public static String getDataSourceType() { return contextHolder.get(); } public static void clearDataSourceType() { contextHolder.remove(); } }6. AOP 方式切换数据源为了在运行时动态切换数据源通常会使用 AOP 切面来拦截方法执行并指定数据源。Aspect Component public class DataSourceAspect { // 通过注解来指定使用哪个数据源 Before(annotation(dataSource)) public void switchDataSource(DataSourceType dataSource) { // 切换数据源 DataSourceContextHolder.setDataSourceType(dataSource.value()); } After(annotation(dataSource)) public void clearDataSource(DataSourceType dataSource) { // 清理数据源标识避免影响其他线程 DataSourceContextHolder.clearDataSourceType(); } }7. 自定义注解来指定数据源创建一个自定义注解DataSourceType用于指定当前方法执行时需要使用的数据源。Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface DataSourceType { String value() default primary; // 数据源标识默认使用primary数据源 }8. 在 Service 层使用注解指定数据源在 Service 层可以使用刚才创建的DataSourceType注解来指定不同的方法使用不同的数据源。Service public class UserService { DataSourceType(primary) public ListUser getPrimaryUsers() { // 查询主数据库 return userRepository.findAll(); } DataSourceType(secondary) public ListUser getSecondaryUsers() { // 查询次数据库 return secondaryUserRepository.findAll(); } }总结数据源配置为每个数据源配置DataSourceBean。动态数据源路由使用AbstractRoutingDataSource来实现动态切换数据源。ThreadLocal存储使用ThreadLocal存储和获取当前线程的数据源标识。AOP切换数据源使用 AOP 来拦截方法并切换数据源。注解方式指定数据源通过自定义注解来指定方法使用的具体数据源。这种方式比较灵活能够在运行时根据业务需求选择不同的数据源适用于多数据源的场景尤其是分库分表、读写分离等复杂应用场景。

相关新闻

Java多商户商城系统源码(最新版)|支持APP+小程序+H5+后台管理

Java多商户商城系统源码(最新版)|支持APP+小程序+H5+后台管理

温馨提示:文末有联系方式最新Java多商户商城系统源码发布 本套系统为当前主流架构下的高兼容性电商解决方案,采用标准化开发规范,完整保留原始代码结构,未经任何删减或篡改,确保开箱即用、稳定可靠。全端覆盖&#xff…

2026/5/17 9:32:15 阅读更多 →
改稿速度拉满 8个降AI率软件降AIGC网站评测:本科生必看的降AI率工具推荐

改稿速度拉满 8个降AI率软件降AIGC网站评测:本科生必看的降AI率工具推荐

在当前学术写作中,AI生成内容(AIGC)的广泛应用为学生提供了便利,但也带来了查重率高、AI痕迹明显等问题。尤其是对于本科生而言,如何在保证论文质量的同时有效降低AI痕迹和查重率,成为一项重要课题。AI降重…

2026/5/17 9:32:14 阅读更多 →
前后端分离校园便利平台系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

前后端分离校园便利平台系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着信息技术的快速发展,校园生活的数字化需求日益增长。传统的校园服务模式往往存在效率低下、信息孤岛等问题,学生和教职工在获取日常服务(如快递代取、二手交易、失物招领等)时面临诸多不便。为解决这一问题,基…

2026/7/3 3:23:44 阅读更多 →

最新新闻

用AI变声神器RVC实现10分钟语音转换:从零开始的完整实战指南

用AI变声神器RVC实现10分钟语音转换:从零开始的完整实战指南

用AI变声神器RVC实现10分钟语音转换&#xff1a;从零开始的完整实战指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-C…

2026/7/4 8:31:20 阅读更多 →
从“是什么“到“为什么“:现代系统诊断工具witr如何重新定义进程分析范式

从“是什么“到“为什么“:现代系统诊断工具witr如何重新定义进程分析范式

从"是什么"到"为什么"&#xff1a;现代系统诊断工具witr如何重新定义进程分析范式 【免费下载链接】witr Why is this running? 项目地址: https://gitcode.com/GitHub_Trending/wi/witr 在当今复杂的系统环境中&#xff0c;当进程异常消耗资源、端…

2026/7/4 8:29:19 阅读更多 →
如何用Flask-profiler定位最耗时的API端点?实战案例分享

如何用Flask-profiler定位最耗时的API端点?实战案例分享

如何用Flask-profiler定位最耗时的API端点&#xff1f;实战案例分享 【免费下载链接】flask-profiler a flask profiler which watches endpoint calls and tries to make some analysis. 项目地址: https://gitcode.com/gh_mirrors/fl/flask-profiler Flask-profiler是…

2026/7/4 8:29:19 阅读更多 →
FlipperZeroHondaFirmware工作原理深度解析:433MHz RF信号捕获技术

FlipperZeroHondaFirmware工作原理深度解析:433MHz RF信号捕获技术

FlipperZeroHondaFirmware工作原理深度解析&#xff1a;433MHz RF信号捕获技术 【免费下载链接】FlipperZeroHondaFirmware Custom Firmware for the Flipper Zero, to add support for Honda key fobs (FCC ID: KR5V2X) 项目地址: https://gitcode.com/gh_mirrors/fl/Flippe…

2026/7/4 8:23:17 阅读更多 →
大模型‘养虾测试’:评估世界模型与长程一致性新标尺

大模型‘养虾测试’:评估世界模型与长程一致性新标尺

1. 项目概述&#xff1a;当“养虾”成为大模型能力测试的新标尺最近在好几个技术群和行业论坛里&#xff0c;频繁看到有人甩出一句&#xff1a;“来&#xff0c;养只虾试试&#xff1f;”——不是水产养殖交流&#xff0c;也不是美食探店邀约&#xff0c;而是工程师、产品经理、…

2026/7/4 8:19:17 阅读更多 →
智能解析技术赋能教育数字化转型:tchMaterial-parser的技术架构与应用实践

智能解析技术赋能教育数字化转型:tchMaterial-parser的技术架构与应用实践

智能解析技术赋能教育数字化转型&#xff1a;tchMaterial-parser的技术架构与应用实践 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课…

2026/7/4 8:15:16 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布&#xff0c;这是一个关键的安全修复版本&#xff0c;修复了多个方面的问题&#xff0c;还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出&#xff0c;mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南&#xff1a;使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL&#xff08;Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器&#xff0c;与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻