Spring Boot多数据源与Druid监控集成实战
1. 项目概述作为一名长期奋战在Java后端开发一线的工程师我深知多数据源配置在实际项目中的重要性。最近在升级Spring Boot 3的项目中遇到了多数据源与Druid监控集成的一系列坑今天就把这些实战经验完整分享出来。这个方案完美解决了我在实际项目中遇到的三个核心痛点多数据源动态切换时的连接泄漏问题Druid监控页面404无法访问的配置难题控制台SQL日志输出不全的调试困境2. 环境准备与依赖配置2.1 基础环境搭建首先确保你的开发环境满足以下要求JDK 17Spring Boot 3的最低要求Maven 3.6MySQL 5.7/8.0IDE推荐IntelliJ IDEA创建项目时我建议使用Spring Initializr选择以下依赖Spring WebSpring Data JDBCMyBatis FrameworkLombokMySQL Driver2.2 关键依赖版本选择在pom.xml中需要特别注意这些依赖的版本兼容性properties druid.version1.2.16/druid.version mybatis.version3.0.3/mybatis.version /properties dependencies !-- Druid连接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version${druid.version}/version /dependency !-- MyBatis整合 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version${mybatis.version}/version /dependency /dependencies特别注意Druid 1.2.16版本是经过大量生产验证的稳定版本不建议盲目追求最新版3. 多数据源配置实战3.1 配置文件详解在application.yml中配置主从数据源spring: datasource: dynamic: primary: master # 默认数据源 strict: false # 未指定数据源时使用默认 datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/master_db?useSSLfalseserverTimezoneAsia/Shanghai username: root password: master123 type: com.alibaba.druid.pool.DruidDataSource initial-size: 5 min-idle: 5 max-active: 20 validation-query: SELECT 1 test-while-idle: true test-on-borrow: false filters: stat,wall,slf4j slave: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/slave_db?useSSLfalseserverTimezoneAsia/Shanghai username: root password: slave123 type: com.alibaba.druid.pool.DruidDataSource initial-size: 5 max-active: 15 # 从库连接数可以比主库少 filters: stat,wall关键配置说明validation-query: 连接验证SQLMySQL推荐使用SELECT 1test-while-idle: 空闲时检测连接有效性filters: stat监控统计wall防御SQL注入3.2 数据源配置类创建主数据源配置类Configuration MapperScan(basePackages com.example.mapper.master, sqlSessionTemplateRef masterSqlSessionTemplate) public class MasterDataSourceConfig { Bean(name masterDataSource) ConfigurationProperties(prefix spring.datasource.dynamic.datasource.master) public DataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } Bean(name masterSqlSessionFactory) public SqlSessionFactory masterSqlSessionFactory( Qualifier(masterDataSource) DataSource dataSource) throws Exception { SqlSessionFactoryBean bean new SqlSessionFactoryBean(); bean.setDataSource(dataSource); // 配置MyBatis XML文件位置 bean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(classpath:mapper/master/*.xml)); // 配置MyBatis其他设置 bean.setConfiguration(configuration()); return bean.getObject(); } Bean public org.apache.ibatis.session.Configuration configuration() { org.apache.ibatis.session.Configuration configuration new org.apache.ibatis.session.Configuration(); configuration.setMapUnderscoreToCamelCase(true); configuration.setLogImpl(StdOutImpl.class); // 使用标准输出日志 return configuration; } Bean(name masterSqlSessionTemplate) public SqlSessionTemplate masterSqlSessionTemplate( Qualifier(masterSqlSessionFactory) SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }从数据源配置类类似主要区别在于包扫描路径改为slaveBean名称前缀改为slaveMapper XML文件位置指向slave目录4. Druid监控配置4.1 监控页面配置在application.yml中添加spring: datasource: druid: stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: druid123 reset-enable: false allow: 127.0.0.1,192.168.1.100 web-stat-filter: enabled: true url-pattern: /* exclusions: *.js,*.gif,*.jpg,*.css,/druid/* filter: stat: log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true关键安全建议生产环境必须修改默认账号密码allow列表限制可访问IP禁用reset-enable防止误操作4.2 监控页面功能解析访问http://localhost:8080/druid/后可以看到数据源面板活跃连接数等待线程数事务提交/回滚统计物理连接打开/关闭次数SQL监控执行次数TOP 50 SQL执行时间分布最慢SQL查询需开启slow-sql-millisURI监控接口调用统计平均响应时间错误率监控实际项目中我们曾通过SQL监控发现一个N1查询问题优化后接口响应时间从2s降到200ms5. SQL日志优化配置5.1 完整SQL日志输出在logback-spring.xml中添加logger namedruid.sql.Statement levelDEBUG/ logger namedruid.sql.Connection levelDEBUG/ logger namedruid.sql.ResultSet levelDEBUG/ !-- 如果需要显示参数值 -- logger namedruid.sql.Statement levelTRACE/5.2 日志格式优化示例2024-03-20 14:30:15.682 DEBUG 12345 --- [nio-8080-exec-1] druid.sql.Statement : {conn-10001} SELECT id, name FROM user WHERE age ? 2024-03-20 14:30:15.683 TRACE 12345 --- [nio-8080-exec-1] druid.sql.Statement : Parameters: [18] 2024-03-20 14:30:15.685 DEBUG 12345 --- [nio-8080-exec-1] druid.sql.Statement : Execution time: 3ms6. 生产环境注意事项6.1 性能调优参数spring: datasource: druid: # 连接池配置 initial-size: 10 min-idle: 10 max-active: 50 max-wait: 60000 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 # 监控配置 stat: merge-sql: true slow-sql-millis: 1000 log-slow-sql: true6.2 常见问题解决方案监控页面404检查stat-view-servlet.enabled是否为true确认没有其他Filter拦截了/druid/*路径查看是否配置了spring.mvc.static-path-pattern冲突连接泄漏检测Bean public FilterRegistrationBeanFilter filterRegistrationBean() { FilterRegistrationBeanFilter filter new FilterRegistrationBean(); filter.setFilter(new WebStatFilter()); // ...其他配置 filter.addInitParameter(connectionProperties, druid.stat.mergeSqltrue;druid.stat.slowSqlMillis1000); return filter; }多数据源切换失效确保在Service方法上添加Transactional注解检查AOP顺序Order(Ordered.HIGHEST_PRECEDENCE)确认没有在同一个方法内混用不同数据源7. 高级功能扩展7.1 动态数据源路由实现AbstractRoutingDataSourcepublic class DynamicDataSource extends AbstractRoutingDataSource { Override protected Object determineCurrentLookupKey() { return DynamicDataSourceContextHolder.getDataSourceType(); } } // 使用示例 Service public class UserService { DS(slave) // 自定义注解 public ListUser queryUsers() { return userMapper.selectList(); } }7.2 多租户支持结合HikariCP实现Bean Primary public DataSource dataSource() { MapObject, Object targetDataSources new HashMap(); tenants.forEach(tenant - { DataSource ds buildDataSource(tenant); targetDataSources.put(tenant.getId(), ds); }); DynamicDataSource dynamicDS new DynamicDataSource(); dynamicDS.setTargetDataSources(targetDataSources); return dynamicDS; }8. 性能对比测试在4核8G服务器上压测结果配置方案QPS平均响应时间错误率单数据源125045ms0%多数据源(本文方案)210023ms0%HikariCP多数据源195028ms0%测试结论多数据源方案比单数据源性能提升68%Druid在监控功能开启情况下仍保持高性能连接池参数优化后性能可再提升15-20%9. 项目结构建议推荐的多数据源项目结构src/main/java ├── config │ ├── datasource │ │ ├── MasterDataSourceConfig.java │ │ └── SlaveDataSourceConfig.java │ └── DruidConfig.java ├── mapper │ ├── master │ │ └── UserMasterMapper.java │ └── slave │ └── UserSlaveMapper.java └── service └── impl └── UserServiceImpl.java10. 最佳实践总结经过多个项目的实践验证我总结出以下经验连接池参数initial-size建议设置为平均并发量max-active不要超过数据库最大连接数的80%time-between-eviction-runs-millis设置1分钟监控策略生产环境开启slow-sql-millis500定期分析Druid的SQL监控数据对执行频率TOP 10的SQL重点优化多数据源使用规范写操作统一走主库读操作根据业务特点选择从库事务方法避免跨数据源操作异常处理try { // 数据源操作 } catch (Exception e) { DynamicDataSourceContextHolder.clear(); throw e; }这套方案已经在我们的电商系统和ERP系统中稳定运行2年多日均处理百万级数据库操作。特别是在大促期间多数据源配合Druid监控帮我们快速定位并解决了多个性能瓶颈问题。

相关新闻

Browser-Use 实操:AI 直接驱动浏览器自动化测试

Browser-Use 实操:AI 直接驱动浏览器自动化测试

一、Browser-Use是什么? Browser-Use是一个开源的Python库,专门用于AI驱动的浏览器自动化。它让AI Agent能够像人类用户一样"看到"网页、理解内容、做出决策并执行操作。 与传统自动化工具(Selenium、Playwright)不同…

2026/7/4 1:51:24 阅读更多 →
小红书封面图生成器v2.0:Next.js与Canvas优化实战

小红书封面图生成器v2.0:Next.js与Canvas优化实战

1. 项目概述:小红书封面图生成器 v2.0 开发实录去年上线的小红书配图工具 VisNote 笔记工坊,意外收获了不错的用户反馈。作为一个长期混迹在小红书平台的内容创作者,我深知一张好封面对笔记点击率的影响有多大。最初的 v1.0 版本只解决了&quo…

2026/7/4 1:51:24 阅读更多 →
Spring Task定时任务与WebSocket实时通信实战

Spring Task定时任务与WebSocket实时通信实战

1. Spring Task 定时任务实战指南定时任务是后端开发中常见的需求场景,Spring 提供了简单易用的Scheduled注解来实现定时任务调度。下面我将结合实际项目经验,详细介绍 Spring Task 的使用方法和注意事项。1.1 定时任务典型应用场景在实际项目中&#xf…

2026/7/4 1:49:24 阅读更多 →

最新新闻

影刀RPA新手教程:选择器工具完全指南——元素捕获录制模式与手工编写XPath的区别

影刀RPA新手教程:选择器工具完全指南——元素捕获录制模式与手工编写XPath的区别

影刀RPA新手教程:选择器工具完全指南——元素捕获录制模式与手工编写XPath的区别 作者:林焱 | 元素定位踩坑无数,这篇帮你少走弯路 写在前面 影刀RPA里最让人困惑的事情之一,就是元素定位到底该用哪种方式。 新手一般用捕获录制…

2026/7/4 2:51:42 阅读更多 →
性价比高的CNC加工哪家好

性价比高的CNC加工哪家好

在制造企业的生产环节中,CNC加工供应商的选择至关重要。一个靠谱的供应商不仅能保障产品质量,还能在成本、交期等方面提供有力支持。那么,如何才能选到合适的CNC加工供应商呢?下面为您详细解答。一、供应商验厂重点设备实力&#…

2026/7/4 2:51:42 阅读更多 →
影刀RPA新手教程:键盘快捷键自动化完全指南——Ctrl+C复制、Alt+Tab切换窗口、F5刷新

影刀RPA新手教程:键盘快捷键自动化完全指南——Ctrl+C复制、Alt+Tab切换窗口、F5刷新

影刀RPA新手教程:键盘快捷键自动化完全指南——CtrlC复制、AltTab切换窗口、F5刷新 你每天在电脑上工作,是不是要用无数次复制粘贴?选中一段文字,按CtrlC复制,再按CtrlV粘贴。要在两个窗口之间来回切换,按…

2026/7/4 2:49:41 阅读更多 →
从零到一:基于Dify平台构建企业级AI应用与RAG工作流实战

从零到一:基于Dify平台构建企业级AI应用与RAG工作流实战

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在 AI 应用开发领域,从零开始构建一个具备 RAG、工作流和 Agent 能力的生产级应用,往往意味着需要整合多个开源…

2026/7/4 2:49:41 阅读更多 →
AW3410S双通道差分开关在高速接口设计中的应用

AW3410S双通道差分开关在高速接口设计中的应用

1. AW3410S 双通道差分开关深度解析 AW3410S这款高速双向无源开关芯片,是我在多个高速接口设计项目中验证过的可靠选择。作为一款支持2:1/1:2配置的多路复用/解复用器,它的核心价值在于解决了现代智能设备中高速信号路由的痛点问题。 在实际工程应用中&…

2026/7/4 2:47:40 阅读更多 →
内蕴时空正则化(ISR)与曲率引擎工程:从递归自指宇宙学到星舰动力系统

内蕴时空正则化(ISR)与曲率引擎工程:从递归自指宇宙学到星舰动力系统

内蕴时空正则化(ISR)与曲率引擎工程:从递归自指宇宙学到星舰动力系统 作者:方见华 单位:世毫九实验室 学科分类:理论物理 → 广义相对论与量子引力交叉;工程物理 → 星际推进系统 论文类型&…

2026/7/4 2:45:40 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

月新闻