SpringBoot集成Druid监控:Web界面配置、SQL性能分析与生产安全实践
1. 项目概述为什么我们需要Druid的Web管理界面在SpringBoot项目中集成数据库连接池Druid几乎是默认选项之一。它性能强悍、功能丰富但很多开发者仅仅把它当作一个“加强版的HikariCP”来用配置完数据源就结束了。这其实只发挥了Druid一半的功力。Druid真正的王牌是其内置的、开箱即用的监控统计功能而这一切的入口就是它的Web管理界面。想象一下这个场景线上服务突然变慢你怀疑是数据库问题。没有监控你只能靠猜——是连接泄漏还是某条SQL慢查询抑或是连接池耗尽你可能会手忙脚乱地加日志、查代码效率低下。而如果启用了Druid Monitor你只需要打开一个浏览器页面就能清晰地看到当前活跃连接数、池中连接总数、执行最慢的SQL、执行次数最多的SQL、甚至是SQL执行时间的分布直方图。所有数据一目了然问题定位从“盲人摸象”变成了“按图索骥”。这个Web管理界面官方称之为“Druid内置监控页面”它不是一个独立部署的服务而是通过一个Servlet集成在你的SpringBoot应用内部。这意味着你无需额外部署组件只需简单配置就能为你的应用赋予强大的数据库层可观测能力。它监控的维度非常全面包括数据源状态、SQL执行、Web请求关联等对于性能调优、线上问题排查和日常健康度巡检来说是一个不可或缺的利器。2. 核心依赖引入与基础配置要让Druid的监控页面跑起来第一步是引入正确的依赖。这里有个常见的误区很多人以为引入了spring-boot-starter-jdbc或mybatis-spring-boot-starter里面自带的Druid就够了。实际上为了使用监控StatViewServlet和WebStatFilter我们需要引入阿里巴巴官方提供的druid-spring-boot-starter它提供了对SpringBoot自动配置的完美支持。在你的pom.xml文件中确保有以下依赖dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.20/version !-- 请使用最新稳定版本 -- /dependency !-- 数据库驱动例如MySQL -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- SpringBoot Web Starter (监控页面本身是一个Web Servlet) -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency接下来是核心的application.yml配置。我们需要完成两件事1. 配置Druid数据源2. 启用并配置监控Servlet和Filter。spring: datasource: # 使用Druid数据源 type: com.alibaba.druid.pool.DruidDataSource # 数据库连接四要素 url: jdbc:mysql://localhost:3306/your_database?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: your_username password: your_password driver-class-name: com.mysql.cj.jdbc.Driver # Druid连接池专属配置 druid: # 连接池初始大小、最小、最大 initial-size: 5 min-idle: 5 max-active: 20 # 获取连接时最大等待时间单位毫秒 max-wait: 60000 # 配置间隔多久才进行一次检测检测需要关闭的空闲连接单位是毫秒 time-between-eviction-runs-millis: 60000 # 连接在池中最小生存的时间单位是毫秒 min-evictable-idle-time-millis: 300000 # 监控相关配置 # 启用WebStatFilter用于采集web关联监控的数据 web-stat-filter: enabled: true # 拦截所有请求 url-pattern: /* # 排除一些不必要的url比如静态资源、健康检查端点 exclusions: *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,/actuator/health # 开启session统计 session-stat-enable: true # 最大session统计个数 session-stat-max-count: 1000 # 启用StatViewServlet提供监控页面 stat-view-servlet: enabled: true # 监控页面的访问路径默认为 /druid/* url-pattern: /druid/* # 是否允许重置监控数据 reset-enable: false # 生产环境建议设为false防止误操作清空统计数据 # 监控页面的登录用户名 login-username: admin # 监控页面的登录密码 login-password: admin123 # 允许访问的IP为空表示允许所有访问。生产环境务必配置 allow: 127.0.0.1 # 拒绝访问的IP (deny优先于allow) # deny: 192.168.1.100 # 开启SQL监控和防火墙 filter: stat: enabled: true # 慢SQL记录阈值单位毫秒 slow-sql-millis: 2000 # 合并多个相同的SQL merge-sql: true wall: enabled: true log4j2: # 如果使用log4j2可以开启日志过滤器 enabled: true注意login-username和login-password是访问监控页面的凭证allow和deny用于IP白名单/黑名单控制。在生产环境中强烈建议设置强密码并配置allow为运维网络IP段切勿直接暴露在公网。reset-enable也建议设为false防止统计数据被意外清空丢失问题发生时的现场数据。2.1 配置项深度解析与选型考量为什么需要配置这么多参数每个参数背后都有其设计意图。以连接池参数为例initial-size应用启动时立即建立的连接数。设置一个合理的初始值如5可以避免应用刚启动处理第一批请求时临时创建连接带来的延迟。min-idle池中始终保持的最小空闲连接数。这保证了即使系统空闲也有立即可用的连接应对突发请求。通常和initial-size保持一致。max-active池中允许的最大连接数。这是最重要的参数之一。设置太小高并发时请求会阻塞在max-wait上导致响应变慢甚至超时设置太大则会过度消耗数据库资源。一个经验公式是max-active (核心业务线程池大小) * (每个请求平均持有连接时间 / 平均请求处理时间)。通常从20开始根据监控调整。max-wait当连接池耗尽时获取连接的最大等待时间。这不是一个“等待连接创建”的时间而是“在队列中等待其他连接被释放”的时间。超过这个时间会抛出异常。设置过短会导致高并发下大量获取连接失败设置过长则可能让请求线程长时间挂起。一般设置为平均业务处理时间的2-3倍。对于监控过滤器web-stat-filter开启session-stat-enable可以统计Web会话信息这对于分析用户行为与数据库操作的关联很有帮助。exclusions配置排除了对静态资源和监控页面本身的统计避免了监控数据自身的干扰。3. 监控页面功能详解与实战应用完成配置后启动你的SpringBoot应用访问http://你的应用地址/druid/login.html输入配置的用户名密码即可进入Druid监控主面板。这个界面信息量巨大我们逐一拆解其核心功能模块。3.1 数据源概览连接池健康度一目了然这是首页的核心区域展示了Druid数据源的实时状态。活跃连接数 (ActiveCount)当前正在被业务使用的连接数。这是判断系统负载最直接的指标。如果这个数长期接近max-active说明连接池可能成为瓶颈。池中连接总数 (PoolingCount)包括活跃连接和空闲连接的总和。它应小于等于max-active。等待线程数 (WaitThreadCount)有多少个线程正在等待获取数据库连接。这是最重要的预警指标之一。如果这个数大于0且持续增长说明连接池已经耗尽请求开始排队系统性能急剧下降。你需要立刻检查是否有连接泄漏或者考虑调大max-active需评估数据库承受能力。SQL执行总数、事务数、错误数这些是吞吐量和稳定性的宏观指标。实操心得我习惯将这里的WaitThreadCount和ActiveCount与max-active的关系制成一个简单的监控规则当WaitThreadCount 0持续超过10秒或ActiveCount max-active * 0.8持续超过30秒就触发告警。这能帮助我们在用户感知到系统变慢之前就发现潜在风险。3.2 SQL监控定位性能瓶颈的利器这是最常用的功能模块。它记录了所有执行过的SQL语句及其统计信息。执行次数、总时间、最慢、并发最大一眼就能找出“最热”和“最慢”的SQL。通常执行次数最多的SQL是优化的首要目标即使单次不快其累积影响也巨大执行最慢的SQL则直接影响用户体验。读取行数、更新行数可以判断SQL的执行效率。一个查询返回1条记录却扫描了10000行那索引很可能有问题。执行RsHold时间分布以直方图形式展示SQL执行时间的分布。健康的系统大部分SQL应落在“0-1 ms”或“1-10 ms”区间。如果长尾如“1s”区间有大量样本说明存在偶发或固定的慢查询。排查案例有一次线上接口超时通过SQL监控页面我迅速发现一条根据状态字段查询的SQL平均执行时间高达2秒且执行次数频繁。点击该SQL的“SQL”列可以查看其详细样本包括参数。发现状态字段有十几个枚举值但查询时传入的值总是集中在其中两三个。检查表索引发现这个状态字段根本没有索引。加上索引后该SQL执行时间降到10毫秒以内接口超时问题迎刃而解。3.3 URL监控与Session监控关联Web请求web-stat-filter采集的数据在这里展示。它可以统计每个Web接口的请求次数、耗时、JDBC请求数、错误数等。这个功能的价值在于它能将数据库性能问题与具体的业务接口关联起来。比如你发现/api/order/create这个URL的“Jdbc执行数”异常高平均每个请求执行了50次SQL。这很可能意味着这个接口存在N1查询问题例如查询一个订单又循环查询了它的所有订单项。结合SQL监控你就能精准定位到是哪些SQL被重复执行从而进行代码层面的优化如使用JOIN或批量查询。3.4 Spring监控与JSON API这是一个高级功能需要额外的配置引入druid-spring-boot-starter已包含。它能够监控Spring Bean的方法执行包括Service层、Dao层的方法调用次数、耗时等。这对于理解业务逻辑层的性能热点非常有帮助。此外Druid还提供了JSON格式的API如/druid/weburi.json,/druid/sql.json方便你将监控数据接入自己的监控系统如PrometheusGrafana。虽然数据不如专业APM系统全面但对于数据库层面的监控来说它轻量、直接、无侵入。4. 常见问题排查与安全加固实录即使配置正确在实际部署中也可能遇到各种问题。下面是我踩过的一些坑和解决方案。4.1 监控页面无法访问或报错问题1访问/druid/login.html返回404。排查首先检查stat-view-servlet.enabled是否设为true。然后检查url-pattern配置确认访问路径是否正确。如果项目有统一的Servlet上下文路径server.servlet.context-path访问路径需要加上它例如http://host:port/context-path/druid/。解决确保依赖正确配置无误。最简单的验证方式是查看应用启动日志搜索“DruidStatViewServlet”如果看到初始化成功的日志说明Servlet已注册。问题2登录后页面空白或显示“Sorry, you are not permitted to view this page.”排查这几乎肯定是IP访问控制导致的。检查stat-view-servlet.allow配置。如果配置了具体的IP如127.0.0.1那么只有从本机访问才被允许。如果你从另一台机器访问就会被拒绝。解决根据你的网络环境调整allow配置。对于内网测试可以暂时注释掉allow配置允许所有但上线前务必改为具体的运维IP段。也可以配置deny来封禁某些IP。4.2 监控数据不准确或缺失问题SQL监控里看不到任何SQL语句或者只有部分SQL。排查1过滤器配置。确保filter.stat.enabledtrue。Druid的监控是通过一系列Filter链实现的如果StatFilter没启用SQL不会被统计。排查2多数据源配置。如果你在代码中手动配置了多个Druid数据源需要确保每个数据源的filters属性都设置为stat,wall或你在配置中启用的过滤器。在Configuration类中创建DataSourceBean时需要手动设置过滤器。Bean ConfigurationProperties(spring.datasource.druid) public DataSource dataSource() { DruidDataSource datasource new DruidDataSource(); // 其他配置... // 手动设置过滤器否则监控可能不生效 datasource.setFilters(stat,wall); return datasource; }排查3连接获取方式。监控只对通过Druid数据源getConnection()方法获取的连接生效。如果你在代码中使用了其他方式获取连接例如直接使用DriverManager这些操作不会被监控。4.3 性能影响与生产环境安全加固启用监控必然有性能开销主要来自SQL解析和统计计算。Druid在这方面做了很多优化开销通常很小官方宣称在1%以下。但对于超高性能场景可以考虑调整filter.stat的log-slow-sql和slow-sql-millis只记录真正慢的SQL。在测试环境充分开启监控在生产环境可以适当关闭一些维度如Spring监控或拉长采样周期。生产环境安全是重中之重除了前面提到的强密码和IP白名单还有几点禁用Reset按钮务必设置reset-enable: false。这个按钮会清空所有历史监控数据在排查问题时若数据被清空将失去重要线索。使用独立账号监控页面的登录账号不要与数据库账号或其他业务账号相同。HTTPS访问如果监控页面需要通过公网访问不推荐务必在网关或应用层配置HTTPS防止登录凭证被窃听。定期审计访问日志Druid本身不记录访问日志但你可以通过Nginx/Apache等Web服务器或Spring Security来记录对/druid/*路径的访问用于安全审计。4.4 与SpringBoot Actuator的集成与区别很多项目也使用了SpringBoot Actuator来暴露健康检查和指标。Actuator的/actuator/metrics端点也能提供一些数据库连接池指标需要依赖micrometer-jdbc但它更偏向于标准化指标输出用于集成到Prometheus等监控系统。Druid Monitor的优势在于其深度和专一性SQL级监控Actuator无法提供具体的SQL语句和执行详情。Web关联能将SQL执行与具体的HTTP请求关联。即开即用的可视化界面无需额外搭建Grafana内置页面功能强大且直观。我的建议是两者可以共存。用Actuator提供标准化的健康检查和基础指标给统一监控平台用Druid Monitor作为数据库和SQL层面的“专家工具”在需要深度排查时使用。只需注意在web-stat-filter.exclusions中加上/actuator/*避免监控数据互相干扰。最后关于网络热词中提到的“arthas 查看druid的数组内容”这是一个更底层的排查手段。当遇到一些极端疑难问题比如怀疑Druid内部连接状态数组出现混乱时可以通过Arthas的ognl命令直接查看Druid数据源对象内部属性。但这属于高级调试技巧绝大多数情况下Web管理界面提供的信息已经足够我们解决90%以上的数据库连接和SQL性能问题。把Druid Monitor用好、用熟无疑是每个SpringBoot后端开发者提升运维和排障能力的必修课。

相关新闻

超实用!这几家P2 LED租赁屏供应商,值得你重点关注

超实用!这几家P2 LED租赁屏供应商,值得你重点关注

行业痛点分析在租赁LED显示屏领域,传统的P2 LED租赁屏存在诸多核心技术挑战。测试显示,传统屏安装繁琐,平均每安装100平方米的屏幕,需要至少5名专业人员花费3 - 5天时间,不仅人工成本高,而且时间成本也不容…

2026/10/8 5:34:14 阅读更多 →
Unity引擎中InjectFix接入使用与边界全梳理

Unity引擎中InjectFix接入使用与边界全梳理

腾讯开源的 Unity C# 代码热修复框架,官方仓库:https://github.com/Tencent/InjectFix 本文结合官方 README / user_manual / FAQ、以及本项目实际接入代码整理。一、是什么 / 原理 定位:Unity 业务 C# 层热修复,不用 Xlua/Lua&am…

2026/10/11 18:28:44 阅读更多 →
Python电商价格爬虫实战:从静态解析到动态接口与反爬对抗

Python电商价格爬虫实战:从静态解析到动态接口与反爬对抗

1. 项目缘起:为什么我们还在写电商价格爬虫?干了这么多年技术,我发现一个挺有意思的现象:无论前端框架怎么变,后端架构怎么演进,电商价格爬虫这个需求,就像野草一样,生命力极其顽强。…

2026/10/8 6:58:50 阅读更多 →

最新新闻

Adobe认证报考全流程指南:从报名到拿证一次讲透

Adobe认证报考全流程指南:从报名到拿证一次讲透

做设计这行,Adobe认证是常被问起的一个东西。不管是刚毕业的学生、想转行的职场新人,还是已经在接私活的自由设计师,总会有人来问:这套认证到底怎么考、怎么报名、多久能拿证、证书有没有用。我前前后后帮团队里几个新人梳理过整套…

2026/10/12 5:29:14 阅读更多 →
C++空对象模式实战:告别判空地狱,重构更干净的代码

C++空对象模式实战:告别判空地狱,重构更干净的代码

接手过一个祖传服务端项目,里面到处都是if (ptr) ptr->DoSomething();这种判断。一开始还能忍,后来越来越离谱,一个业务函数里三分之一的行数都在判空,抄都抄不动。后来我把它们一个个改成空对象模式,代码量减少了一…

2026/10/12 5:29:14 阅读更多 →
前缀数组从原理到实战:区间求和与树状数组的取舍

前缀数组从原理到实战:区间求和与树状数组的取舍

提到"前缀数组",很多人的第一反应是LeetCode入门题里那个prefixSum[i] prefixSum[i-1] nums[i]。但真正把它用明白、用出价值的人,其实不多。前缀数组(也叫前缀和)本质上是一种"预处理换查询"的思路&#x…

2026/10/12 5:29:14 阅读更多 →
YOLOv8车流检测系统:从训练到多端部署的完整实战

YOLOv8车流检测系统:从训练到多端部署的完整实战

简介:面向毕业设计与智能交通应用场景,这套基于YOLOv8的车流检测系统提供了从模型训练到多端部署的完整工程实现。包内共396个文件,含150个Python源码、132个编译后的pyc模块、34个YAML配置文件、40张PNG界面图与23张JPG实景测试图&#xff0…

2026/10/12 5:29:13 阅读更多 →
Python入口判断:__name__ == ‘__main__‘的底层原理与工程实践

Python入口判断:__name__ == ‘__main__‘的底层原理与工程实践

1. 先把这个“万年不变”的写法拆开看任何一个学过Python的人,几乎都见过这一行:if __name__ __main__:很多教程把它放在最后,很多开源项目的入口文件也用它,但真正问一句“这句话到底在干什么”,能答清楚的人其实不多…

2026/10/12 5:29:13 阅读更多 →
Apache Beam Python Filter 变换详解:6 种过滤 PCollection 元素的实战方案

Apache Beam Python Filter 变换详解:6 种过滤 PCollection 元素的实战方案

【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam18/beam 点击查看 免费下载 Filter 是 Apache Beam Python SDK 中用于按条件筛选 PCollection 元素的…

2026/10/12 5:28:13 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →