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/22 7:23:35 阅读更多 →
Unity UI点击检测:EventSystem与射线检测的5个实战技巧

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

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

2026/7/22 7:23:35 阅读更多 →
YOLOv10在密集行人检测中的优化实践

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

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

2026/7/22 7:22:35 阅读更多 →

最新新闻

Redis加MySQL打造高并发无人售货机后台:每秒万级订单如何扛住~YH

Redis加MySQL打造高并发无人售货机后台:每秒万级订单如何扛住~YH

单台售货机一天几百单,1000台就是几十万单。高峰时段午休、下班订单并发可能达到每秒上千甚至上万。如何设计高并发、高可用的后台系统?本文从架构设计到落地细节,给出完整方案。一、高并发场景真实分析业务数据量化让我们先算一笔账。假设全…

2026/7/22 8:16:54 阅读更多 →
蛋白磷酸化不会做?一文讲透体外磷酸化实验设计与流程

蛋白磷酸化不会做?一文讲透体外磷酸化实验设计与流程

蛋白磷酸化是生命科学中最核心的翻译后修饰之一,堪称细胞信号转导的“分子开关”。在真核生物中,约30%的蛋白质可被磷酸化修饰,这一修饰调控着细胞增殖、分化、凋亡、代谢等几乎一切生命活动。当激酶将ATP的磷酸基团转移至底物蛋白的丝氨酸、…

2026/7/22 8:16:54 阅读更多 →
RPA软件推荐:泛微千里聆RPA为何稳居榜首?

RPA软件推荐:泛微千里聆RPA为何稳居榜首?

1. 引言:为什么需要RPA?在数字化转型浪潮中,企业面临着大量重复、规则明确的业务流程,如数据录入、报表生成、跨系统数据同步等。传统的人工处理方式不仅效率低下、容易出错,还占用了员工大量宝贵时间。机器人流程自动…

2026/7/22 8:16:54 阅读更多 →
《键盘沉浸式样式》二、输入法应用沉浸模式指南

《键盘沉浸式样式》二、输入法应用沉浸模式指南

HarmonyOS 输入法应用沉浸模式开发指南:从前台应用到输入法的全链路沉浸式体验 前言 在 HarmonyOS 应用开发中,沉浸式体验已经成为提升用户感知品质的关键要素。当用户在搜索、编辑等场景中使用输入法时,如果键盘区域与应用界面之间存在明显…

2026/7/22 8:16:54 阅读更多 →
从“人找数”到“数找人”:数猎天下Data Neo如何让企业终于敢用AI做决策

从“人找数”到“数找人”:数猎天下Data Neo如何让企业终于敢用AI做决策

一、行业阵痛:BI做了十年,数据还是“不敢用”“上个月的转化率为什么掉了?”——这个简单的问题,在大多数企业里依然要花两三天才能得到一个半信半疑的答案。不是因为没有数据,而是因为数据散落在十几张表里&#xff1…

2026/7/22 8:16:54 阅读更多 →
江门肇庆挂靠地址注册风险对比:独立办公与集群注册区别

江门肇庆挂靠地址注册风险对比:独立办公与集群注册区别

肇庆挂靠地址与独立办公场景解析 不同选择适合不同需求,不能简单判断谁“绝对更好”。在江门、肇庆等地区创业时,企业注册地址的选择直接影响合规成本与经营灵活性。对于初创团队而言,是选择成本较低的挂靠地址(集群注册&#xf…

2026/7/22 8:15:53 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻