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

SpringBoot项目里,用dynamic-datasource搞定多库读写分离和事务,保姆级避坑指南

SpringBoot多数据源实战dynamic-datasource深度整合与避坑手册当你的应用流量开始突破单库性能瓶颈或是业务需要接入多个异构数据库时如何优雅管理数据源连接就成了必须面对的工程难题。最近在重构公司订单系统时我亲历了从单数据源到多数据源的完整迁移过程其中dynamic-datasource的表现令人惊喜——这个轻量级组件仅用三天就帮我们实现了读写分离、多租户数据隔离和跨库事务控制。本文将分享实战中积累的配置技巧和那些只有踩过坑才知道的细节。1. 为什么选择dynamic-datasource在技术选型阶段我们对比了三种主流方案方案学习成本功能完整性侵入性事务支持原生Spring多数据源高低强仅单库ShardingSphere中高弱分布式事务dynamic-datasource低中高弱本地/分布式事务最终选择dynamic-datasource的关键因素在于近乎零改造与MyBatis/MyBatis-Plus天然融合已有DAO层代码几乎无需修改灵活的分组策略通过db1、db2_slave这样的命名即可自动建立主从关系事务增强DSTransactional注解完美解决跨库事务难题运行时动态调整支持不停机增减数据源这对需要动态扩容的SaaS应用至关重要实际踩坑提示如果项目已使用HikariCP连接池注意排除Druid的自动配置spring.autoconfigure.excludecom.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure2. 快速搭建多数据源环境2.1 基础配置实战新建一个SpringBoot 2.7项目引入关键依赖dependency groupIdcom.baomidou/groupId artifactIddynamic-datasource-spring-boot-starter/artifactId version3.5.2/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency配置文件采用分组模式实现一主两从架构spring: datasource: dynamic: primary: master # 默认数据源 strict: true # 启用严格模式 datasource: master: url: jdbc:mysql://127.0.0.1:3306/master?useSSLfalse username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave_1: url: jdbc:mysql://127.0.0.1:3307/slave1?useSSLfalse username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver slave_2: url: jdbc:mysql://127.0.0.1:3308/slave2?useSSLfalse username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver2.2 注解驱动开发在Service层通过注解实现动态路由Service DS(master) // 类级别默认数据源 public class OrderServiceImpl implements OrderService { Autowired private OrderMapper orderMapper; Override DS(slave) // 方法级别覆盖 public Order getById(Long id) { return orderMapper.selectById(id); } Override DSTransactional // 多数据源事务 public void createOrder(Order order) { orderMapper.insert(order); inventoryService.reduceStock(order.getProductId()); // 跨服务调用 } }关键注意事项避免在私有方法上使用DS注解Spring AOP无法代理私有方法嵌套服务调用时内层方法会继承外层的数据源上下文除非显式声明新注解使用DSTransactional时务必关闭原生Transactional3. 高级特性实战3.1 智能读写分离通过自定义拦截器实现零侵入读写分离Intercepts({ Signature(typeExecutor.class, methodupdate, args{MappedStatement.class,Object.class}), Signature(typeExecutor.class, methodquery, args{MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class}) }) public class ReadWriteInterceptor implements Interceptor { private Random random new Random(); Override public Object intercept(Invocation invocation) throws Throwable { MappedStatement ms (MappedStatement) invocation.getArgs()[0]; if (ms.getSqlCommandType() SqlCommandType.SELECT) { // 随机选择从库 int slaveIndex random.nextInt(2) 1; DynamicDataSourceContextHolder.push(slave_ slaveIndex); } else { DynamicDataSourceContextHolder.push(master); } try { return invocation.proceed(); } finally { DynamicDataSourceContextHolder.clear(); } } }在配置类中注册拦截器Configuration public class MybatisConfig { Bean public ReadWriteInterceptor readWriteInterceptor() { return new ReadWriteInterceptor(); } }3.2 动态数据源管理运行时动态增减数据源适用于多租户场景RestController RequestMapping(/datasource) public class DataSourceController { Autowired private DataSourceCreator dataSourceCreator; PostMapping(/add) public String addDataSource(RequestBody DataSourceDTO dto) { DataSourceProperty property new DataSourceProperty(); property.setPoolName(dto.getName()); property.setUrl(dto.getUrl()); property.setUsername(dto.getUsername()); property.setPassword(dto.getPassword()); DynamicRoutingDataSource ds (DynamicRoutingDataSource) DynamicDataSourceAutoConfiguration.dynamicDataSource(); ds.addDataSource(dto.getName(), dataSourceCreator.createDataSource(property)); return 数据源添加成功; } DeleteMapping(/remove/{name}) public String removeDataSource(PathVariable String name) { DynamicRoutingDataSource ds (DynamicRoutingDataSource) DynamicDataSourceAutoConfiguration.dynamicDataSource(); ds.removeDataSource(name); return 数据源移除成功; } }4. 生产环境避坑指南4.1 事务混用陷阱致命错误示范Transactional // 原生事务 DS(slave) public void faultyMethod() { // 跨库操作 orderDao.update(order); logDao.insert(log); }正确做法应该是完全禁用Transactional注解统一使用DSTransactional管理事务对于需要分布式事务的场景集成Seataspring: datasource: dynamic: seata: true # 开启seata seata-mode: AT # 使用AT模式4.2 连接池配置优化建议为不同特性的数据源设置独立连接池参数master: url: jdbc:mysql://127.0.0.1:3306/master hikari: maximum-pool-size: 20 connection-timeout: 30000 idle-timeout: 600000 slave_1: url: jdbc:mysql://127.0.0.1:3307/slave1 hikari: maximum-pool-size: 30 connection-timeout: 60000 read-only: true4.3 监控与健康检查暴露数据源健康端点management: endpoints: web: exposure: include: health,info,metrics health: db: enabled: true dynamic-datasource: enabled: true通过Micrometer监控关键指标Bean public MeterBindersInitializer meterBinders(DataSource dataSource) { return new MeterBindersInitializer() { Override public void afterPropertiesSet() { Metrics.addDataSourceMetrics((DynamicRoutingDataSource) dataSource); } }; }在Kubernetes环境中建议配置如下存活探针livenessProbe: httpGet: path: /actuator/health/dynamic-datasource port: 8080 initialDelaySeconds: 60 periodSeconds: 30

相关文章:

SpringBoot项目里,用dynamic-datasource搞定多库读写分离和事务,保姆级避坑指南

SpringBoot多数据源实战:dynamic-datasource深度整合与避坑手册 当你的应用流量开始突破单库性能瓶颈,或是业务需要接入多个异构数据库时,如何优雅管理数据源连接就成了必须面对的工程难题。最近在重构公司订单系统时,我亲历了从…...

YOLOv8优化:轻量注意力实战 | ECA模块集成与性能对比分析

1. 为什么需要轻量注意力模块 在目标检测领域,YOLO系列一直以速度和精度的平衡著称。但随着应用场景的复杂化,传统卷积神经网络在长距离依赖关系建模上的局限性逐渐显现。这就是注意力机制大显身手的地方——它能让网络学会"看重点"。 我曾在工…...

3分钟找回丢失的Windows快捷键:Hotkey Detective终极使用指南

3分钟找回丢失的Windows快捷键:Hotkey Detective终极使用指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你…...

深度解析ModTheSpire:为什么这款开源工具能彻底改变《杀戮尖塔》的游戏体验

深度解析ModTheSpire:为什么这款开源工具能彻底改变《杀戮尖塔》的游戏体验 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 如果你是一位《杀戮尖塔》的忠实玩家&#xff0…...

Zotero插件商店终极指南:3步构建你的高效学术工具箱

Zotero插件商店终极指南:3步构建你的高效学术工具箱 【免费下载链接】zotero-addons Zotero Add-on Market | Zotero插件市场 | Browsing, installing, and reviewing plugins within Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-addons 还在…...

3步掌握B站字幕提取:从零到精通的完整指南

3步掌握B站字幕提取:从零到精通的完整指南 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 对于技术爱好者和内容创作者来说,高效获取B站视…...

如何用茉莉花插件3倍提升Zotero中文文献管理效率:终极指南

如何用茉莉花插件3倍提升Zotero中文文献管理效率:终极指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在为Zote…...

Git克隆又报错?GnuTLS recv error (-110) 保姆级排查与修复指南(含代理设置详解)

Git克隆报错GnuTLS recv error (-110)全流程诊断手册:从网络配置到TLS深度解析 当你正专注地克隆一个Git仓库,突然终端抛出GnuTLS recv error (-110): The TLS connection was non-properly terminated——这个看似晦涩的错误背后,可能隐藏着…...

Vue3-Marquee:现代前端开发中的流动艺术

Vue3-Marquee:现代前端开发中的流动艺术 【免费下载链接】vue3-marquee A simple marquee component with ZERO dependencies for Vue 3. 项目地址: https://gitcode.com/gh_mirrors/vu/vue3-marquee 在数字界面的海洋中,信息如潮水般涌动。我们曾…...

别再手动调图了!用MATLAB代码批量美化论文折线图(附完整参数设置清单)

MATLAB科研绘图革命:代码化美学设计全指南 科研图表是论文的"门面",但多数研究者仍被困在重复的手动调整中。我曾耗时两周调整30组实验数据的图表格式,直到发现代码化美学的力量——现在只需5分钟就能完成过去两天的工作量。 1. 为…...

知网文献批量下载终极指南:3步实现自动化检索与高效管理

知网文献批量下载终极指南:3步实现自动化检索与高效管理 【免费下载链接】CNKI-download :frog: 知网(CNKI)文献下载及文献速览爬虫 (Web Scraper for Extracting Data) 项目地址: https://gitcode.com/gh_mirrors/cn/CNKI-download 在学术研究工作中&#…...

Windows平台Hadoop 3.3.6环境搭建与IDEA集成开发:从零实现HDFS文件操作

1. Windows平台Hadoop 3.3.6环境搭建全攻略 在Windows上搭建Hadoop环境对于大数据初学者来说是个不小的挑战。我刚开始接触Hadoop时,光是解决Windows兼容性问题就折腾了好几天。不过别担心,跟着我的步骤走,你可以在30分钟内完成Hadoop 3.3.6的…...

从 .NET 8 到 .NET 9 RC:C# 14 AOT 对 Dify 客户端的 ABI 兼容性断层已确认——3 类 runtime panic 场景、2 种 patch 方案、1 小时热修复指南

第一章:C# 14 原生 AOT 部署 Dify 客户端 安全性最佳方案C# 14 原生 AOT(Ahead-of-Time)编译能力显著提升了 .NET 应用的启动性能与攻击面收敛能力,结合 Dify 的 RESTful API 设计,可构建零依赖、无 JIT、内存隔离的客…...

C# 14 AOT 构建管道安全审计清单(含 11 项 CI/CD 级拦截规则、2 个自研 MSBuild 安全钩子、1 份可直接导入 Azure DevOps 的 YAML 模板)

第一章:C# 14 原生 AOT 部署 Dify 客户端 安全性最佳方案C# 14 原生 AOT(Ahead-of-Time)编译能力显著提升了 .NET 应用在边缘与受限环境中的部署安全性,尤其适用于与 Dify AI 平台交互的客户端场景。通过剥离 JIT 编译器、消除运行…...

收藏!程序员必看:3个月小白也能掌握的大模型开发完整路线图

本文针对程序员在大模型开发中常见的"框架陷阱"“理论空转”"碎片化学习"三大误区,提供了系统的学习路线。从数学与编程基础(200小时)、模型架构本质(300小时)、工程化实践(400小时&am…...

知网文献批量下载终极指南:3步实现高效学术研究自动化

知网文献批量下载终极指南:3步实现高效学术研究自动化 【免费下载链接】CNKI-download :frog: 知网(CNKI)文献下载及文献速览爬虫 (Web Scraper for Extracting Data) 项目地址: https://gitcode.com/gh_mirrors/cn/CNKI-download 还在为手动下载知网文献而…...

手把手教你用VMware搭建IC设计EDA虚拟机(含Cadence/Synopsys/Mentor全家桶)

零基础IC设计环境搭建:VMware虚拟机全流程避坑指南 刚接触IC设计的朋友们,一定被各种EDA软件的安装配置折磨过吧?不同工具需要不同的Linux环境依赖,版本冲突、许可证配置、工艺库路径设置…随便一个环节出错就能让人抓狂。今天我们…...

Docker镜像签名失效的11个真实生产案例,含Kubernetes准入控制拦截日志溯源

第一章:Docker镜像签名失效的典型生产现象与认知重构当Kubernetes集群中某次滚动更新突然卡在 ImagePullBackOff 状态,且日志显示 failed to verify signature: no valid signatures found,这并非网络或权限问题,而是镜像签名链断…...

番茄小说下载器:轻松保存您喜爱的网络小说

番茄小说下载器:轻松保存您喜爱的网络小说 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 想要永久收藏番茄小说平台上的精彩故事吗?这款免费开源的番茄小说下载器正…...

eNSP模拟企业网:手把手教你配置DHCP服务器与中继(含三层交换机实战)

eNSP模拟企业网:手把手教你配置DHCP服务器与中继(含三层交换机实战) 当企业网络规模不断扩大,手动为每台设备分配IP地址不仅效率低下,还容易出错。DHCP(动态主机配置协议)作为网络自动化的基石&…...

5个高级技巧完全指南:专业级AMD Ryzen系统调试与优化实战手册

5个高级技巧完全指南:专业级AMD Ryzen系统调试与优化实战手册 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: htt…...

从“变化”到“幅值”:增量式Σ-Δ ADC如何重塑高精度测量

1. 增量式Σ-Δ ADC与传统Σ-Δ ADC的本质区别 我第一次接触增量式Σ-Δ ADC是在设计一款高精度电子秤的时候。当时遇到一个棘手的问题:传统ADC在测量微小重量变化时,读数总是飘忽不定。后来改用增量式方案,问题迎刃而解。这让我意识到&#…...

XUnity.AutoTranslator:让Unity游戏实现多语言实时翻译的终极工具

XUnity.AutoTranslator:让Unity游戏实现多语言实时翻译的终极工具 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂外语游戏而烦恼吗?XUnity.AutoTranslator为你提供了…...

不止是磁化曲线:手把手教你用OOMMF输出和分析OVF 2.0格式的矢量场数据

从磁化曲线到矢量场分析:OOMMF数据处理实战指南 在微磁模拟领域,OOMMF(Object Oriented MicroMagnetic Framework)作为经典的开源工具,其输出数据的深度解析能力往往被研究者低估。大多数教程止步于基础模拟设置和磁化…...

Windows Cleaner终极指南:5大核心功能彻底解决C盘爆红与系统卡顿问题

Windows Cleaner终极指南:5大核心功能彻底解决C盘爆红与系统卡顿问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款专为Windo…...

Docker容器监控配置实战:从零搭建Prometheus+Grafana全链路监控(含完整YAML模板)

第一章:Docker容器监控配置实战:从零搭建PrometheusGrafana全链路监控(含完整YAML模板)环境准备与依赖安装 确保宿主机已安装 Docker 和 docker-compose v2.20。运行以下命令验证: # 检查版本 docker --version docker…...

RAGAS中RAG评估指标简单介绍

一、RAGAS 的评估指标分工评估环节RAGAS 指标衡量什么计算公式逻辑检索评估上下文精度 (Context Precision)检索结果中有用信息是否排在前列,衡量排序质量相关文档数 / 检索文档总数上下文召回率 (Context Recall)标准答案中的信息有多少被检索到了,衡量…...

3分钟掌握Win11Debloat:让你的Windows 11性能飙升44%的终极优化指南

3分钟掌握Win11Debloat:让你的Windows 11性能飙升44%的终极优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to dec…...

色盲视角下的连通块问题:用Python和BFS两种解法复现米哈游暑期实习笔试

色盲视角下的连通块问题:Python与BFS双解剖析 引言:当算法遇见色盲视角 在算法面试中,网格搜索类问题一直是高频考点。而这道来自米哈游的笔试题,巧妙地将连通块问题与色盲视角结合,不仅考察基础算法能力,更…...

【独家首发】Spring Boot 4.0 Agent-Ready 架构压力测试报告:17个Agent并发加载Case中,仅2个通过JFR+AsyncProfiler双重验证

第一章:Spring Boot 4.0 Agent-Ready 架构避坑指南Spring Boot 4.0 引入了原生支持 Java Agent 的运行时契约(Agent-Ready),旨在为可观测性、AOP 增强、字节码热替换等场景提供标准化接入点。但该能力并非开箱即用,若未…...