Spring Boot多数据源配置实战:Druid+MyBatisPlus整合指南
1. 项目概述在微服务架构盛行的当下Spring Boot项目经常需要同时连接多个数据库实例。最近在重构一个老旧的会员系统时就遇到了需要同时操作MySQL用户库和TiDB交易库的场景。经过多次踩坑终于实现了基于DruidMyBatisPlus的稳定多数据源方案。这个方案最大的特点在于完全兼容Spring Boot自动配置特性支持Druid连接池的各项监控指标保留MyBatisPlus的所有便捷操作事务管理清晰可控特别提醒多数据源配置中最容易犯的错误就是混淆Mapper接口和XML文件的路径配置这会导致经典的Invalid bound statement异常。2. 核心配置解析2.1 依赖管理关键点在pom.xml中需要特别注意这些依赖项properties spring-boot.version2.7.12/spring-boot.version druid.version1.2.16/druid.version mybatis-plus.version3.5.3.1/mybatis-plus.version /properties dependencies !-- 核心starter -- dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version${druid.version}/version /dependency !-- MyBatisPlus必须单独指定版本 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version${mybatis-plus.version}/version exclusions exclusion groupIdcom.zaxxer/groupId artifactIdHikariCP/artifactId /exclusion /exclusions /dependency /dependencies这里有个重要细节MyBatisPlus默认使用HikariCP需要通过exclusions强制移除否则会与Druid产生冲突。2.2 配置文件陷阱application.yml的配置需要特别注意格式spring: datasource: master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/master?useSSLfalse username: root password: 123456 druid: initial-size: 5 max-active: 20 validation-query: SELECT 1 slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/slave?useSSLfalse username: root password: 123456 druid: initial-size: 3 max-active: 15致命陷阱第一个数据源用url属性后续数据源必须用jdbc-url否则启动时会报jdbcUrl is required错误。这是Spring Boot自动配置机制的特殊要求。3. 数据源配置实战3.1 主数据源配置Configuration MapperScan(basePackages com.example.mapper.master, sqlSessionFactoryRef masterSqlSessionFactory) public class MasterDataSourceConfig { Bean Primary ConfigurationProperties(spring.datasource.master) public DataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } Bean Primary public SqlSessionFactory masterSqlSessionFactory( Qualifier(masterDataSource) DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactory new MybatisSqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setMapperLocations( new PathMatchingResourcePatternResolver() .getResources(classpath:mapper/master/*.xml)); // 关键注入MyBatisPlus配置 MybatisConfiguration configuration new MybatisConfiguration(); configuration.setMapUnderscoreToCamelCase(true); configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class); sessionFactory.setConfiguration(configuration); sessionFactory.setPlugins(new MybatisPlusInterceptor()); return sessionFactory.getObject(); } // 其他必要bean... }3.2 从数据源配置Configuration MapperScan(basePackages com.example.mapper.slave, sqlSessionFactoryRef slaveSqlSessionFactory) public class SlaveDataSourceConfig { Bean ConfigurationProperties(spring.datasource.slave) public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } Bean public SqlSessionFactory slaveSqlSessionFactory( Qualifier(slaveDataSource) DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactory new MybatisSqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setMapperLocations( new PathMatchingResourcePatternResolver() .getResources(classpath:mapper/slave/*.xml)); // 复用主数据源的MyBatisPlus配置 MybatisConfiguration configuration new MybatisConfiguration(); configuration.setMapUnderscoreToCamelCase(true); sessionFactory.setConfiguration(configuration); sessionFactory.setPlugins(new MybatisPlusInterceptor()); return sessionFactory.getObject(); } // 其他必要bean... }4. 事务管理方案4.1 单数据源事务直接在Service方法上使用Transactional即可Service RequiredArgsConstructor public class OrderService { private final OrderMapper orderMapper; // 主库Mapper Transactional public void createOrder(Order order) { orderMapper.insert(order); } }4.2 跨数据源事务需要引入JTA实现如AtomikosBean public JtaTransactionManager transactionManager() { return new JtaTransactionManager(); } // 使用时指定事务管理器 Transactional(transactionManager transactionManager) public void crossDatabaseOperation() { masterMapper.insert(...); slaveMapper.update(...); }性能警告分布式事务会显著降低系统吞吐量建议通过最终一致性方案替代。5. 监控配置技巧Druid的监控面板配置Bean public ServletRegistrationBeanStatViewServlet druidServlet() { ServletRegistrationBeanStatViewServlet reg new ServletRegistrationBean(); reg.setServlet(new StatViewServlet()); reg.addUrlMappings(/druid/*); reg.addInitParameter(loginUsername, admin); reg.addInitParameter(loginPassword, admin); return reg; } Bean public FilterRegistrationBeanWebStatFilter filterRegistrationBean() { FilterRegistrationBeanWebStatFilter reg new FilterRegistrationBean(); reg.setFilter(new WebStatFilter()); reg.addUrlPatterns(/*); reg.addInitParameter(exclusions, *.js,*.gif,*.jpg,*.css,/druid/*); return reg; }访问http://localhost:8080/druid即可查看SQL监控、URI监控等数据。6. 常见问题排查6.1 Mapper绑定失败错误现象BindingException: Invalid bound statement (not found)解决方案检查MapperScan的basePackages是否包含对应Mapper接口检查setMapperLocations路径是否包含XML文件确认XML中的namespace与Mapper接口全限定名一致6.2 事务不生效可能原因方法不是public自调用this.method()异常被catch未抛出数据库引擎不支持事务如MyISAM6.3 连接泄漏Druid监控面板查看activeCount持续增长检查代码中是否忘记关闭Connection/Statement/ResultSet7. 性能优化建议连接池参数调优druid: min-idle: 5 max-active: 50 max-wait: 3000 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000MyBatisPlus二级缓存Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); interceptor.addInnerInterceptor(new CachingInnerInterceptor()); return interceptor; }SQL监控慢查询阈值druid: filter: stat: log-slow-sql: true slow-sql-millis: 10008. 扩展思考对于更复杂的多租户场景可以考虑动态数据源路由AbstractRoutingDataSourceSchema级别隔离MyBatisPlus租户插件在K8s环境中部署时建议使用ConfigMap管理数据源配置为每个Pod设置合理的连接池大小实现健康检查接口监控连接状态

相关新闻

大厂HR不敢说的秘密:技术简历上出现这3个词,直接进回收站

大厂HR不敢说的秘密:技术简历上出现这3个词,直接进回收站

你有多久没更新简历了?别急着改,先看一眼技能栏里那几个词。如果你还写着“精通功能测试”“负责用例执行”“熟悉QTP”,那最好先别投大厂。 这不是危言耸听。今年春招,某头部大厂HR私下跟我说了一句话:“现在收到测试…

2026/7/27 12:00:27 阅读更多 →
Unity UI点击检测:EventSystem与射线检测的5个实战技巧

Unity UI点击检测:EventSystem与射线检测的5个实战技巧

1. 项目概述:为什么UI点击检测是Unity开发者的必修课在Unity里做UI交互,点击检测是绕不开的第一道坎。看起来简单,不就是点一下按钮有反应吗?但实际开发中,尤其是项目规模变大、UI层级复杂、特效满天飞的时候&#xff…

2026/7/29 18:39:44 阅读更多 →
YOLOv10在密集行人检测中的优化实践

YOLOv10在密集行人检测中的优化实践

1. 项目概述:当YOLOv10遇上密集行人检测密集场景下的行人检测一直是计算机视觉领域的硬骨头。去年在上海外滩实测某商业检测系统时,面对每秒30帧的4K视频流,传统检测器在人群密度超过3人/㎡时,漏检率直接飙升至40%以上。这正是我们…

2026/7/26 11:55:43 阅读更多 →

最新新闻

从稚晖君现象看全栈硬件开发:如何构建跨领域技术能力与项目思维

从稚晖君现象看全栈硬件开发:如何构建跨领域技术能力与项目思维

1. 从“稚晖君现象”谈起:我们究竟在向往什么?最近几年,在科技创客圈乃至更广泛的互联网上,“稚晖君”这个名字几乎成了一个符号。每当他在视频平台更新一个硬核项目,从自制机械臂到自动驾驶自行车,总能引发…

2026/7/30 13:51:33 阅读更多 →
Python图像处理实战:15个核心模块构建自动化处理框架

Python图像处理实战:15个核心模块构建自动化处理框架

最近在图像处理项目中,你是不是经常遇到这样的场景:需要批量处理大量图片,但手动操作既耗时又容易出错?或者想要实现一些复杂的图像变换,却不知道从何入手?今天我们就来深入探讨一个实用的图像处理项目——…

2026/7/30 13:51:33 阅读更多 →
自回归模型(AR)原理与Python实战:时间序列预测经典方法

自回归模型(AR)原理与Python实战:时间序列预测经典方法

1. 自回归模型:时间序列预测的经典武器 第一次接触自回归(AR)模型时,我被它简洁的数学表达和强大的预测能力震撼了。这个诞生于1927年的方法(由尤尔Yule提出),至今仍是金融、气象、工业控制等领域的标配工具。不同于那…

2026/7/30 13:51:33 阅读更多 →
Visual C++ Build Tools:轻量级C++构建工具链配置与实战指南

Visual C++ Build Tools:轻量级C++构建工具链配置与实战指南

1. 项目概述:为什么你需要独立的C Build Tools? 如果你是一名C开发者,尤其是刚入门不久,或者需要在多台机器上配置开发环境,那么“Visual C Build Tools”这个名字你一定不陌生,也可能被它搞得一头雾水。它…

2026/7/30 13:51:33 阅读更多 →
外卖优惠卡分佣裂变小程序系统开发哪家靠谱

外卖优惠卡分佣裂变小程序系统开发哪家靠谱

外卖优惠卡分佣裂变小程序系统开发哪家靠谱外卖优惠卡分佣裂变小程序是目前本地生活轻创业的主流项目,依托外卖优惠卡发放、用户省钱下单、分享裂变赚佣金的模式,实现用户自增长与平台持续变现。市面上多数小程序开发方案仅实现基础的领卡、分佣、分享功…

2026/7/30 13:51:33 阅读更多 →
商品主图点击率上不去,有没有AI工具能生成高转化主图

商品主图点击率上不去,有没有AI工具能生成高转化主图

一、主图换了十几版,点击率还是半死不活做电商运营的团队,经常遇到这种情况:商品主图反复拍摄、反复设计,换了十几版,点击率始终在平均水平徘徊,上不去。问题可能不是产品不好,而是主图没有打中…

2026/7/30 13:50:32 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻