数据库连接池 Druid

张开发
2026/4/7 23:26:05 15 分钟阅读

分享文章

数据库连接池 Druid
文章目录一、数据库连接池是什么二、什么时候用典型使用场景1. Web 项目2. 高并发业务系统3. 长时间运行的后端服务三、什么时候不一定要用四、它实现了哪些核心功能1. 连接复用2. 连接数量控制3. 获取连接的排队与等待4. 空闲连接管理5. 连接有效性检测6. 超时控制7. 泄漏检测8. 监控与统计五、它有什么作用1. 提升性能2. 提高并发能力3. 保护数据库4. 提升稳定性六、一个简单流程七、常见连接池有哪些八、总结Druid 技术学习路线一、第一阶段先搞懂它是什么需要掌握的内容这一阶段目标二、第二阶段会在项目里集成和使用学习内容这一阶段目标三、第三阶段掌握核心连接池参数1. 连接数量相关2. 空闲连接管理3. 连接校验4. PreparedStatement 缓存这一阶段目标四、第四阶段掌握监控功能学习内容你需要会的事这一阶段目标五、第五阶段掌握 Druid Filter 机制常见 Filter重点学习 wall这一阶段目标六、第六阶段掌握常见问题排查1. 连接池耗尽2. 死连接问题3. 慢 SQL 问题4. 连接泄漏这一阶段目标七、第七阶段理解底层原理要掌握的原理点这一阶段目标八、第八阶段对比其他连接池至少要会对比1. Druid vs HikariCP2. Druid vs C3P0 / DBCP面试表达可以这样说推荐学习顺序第 1 步数据库连接池基础第 2 步Druid 基础使用第 3 步核心参数配置第 4 步监控页面和 SQL 统计第 5 步Filter 机制第 6 步问题排查第 7 步源码和原理第 8 步面试总结对你当前阶段更实用的学习建议必学重点加分项源码项学习路线总结数据库连接池本质上是一个提前创建并统一管理数据库连接的“连接仓库”。你可以把它理解成这样不用连接池每来一个请求就临时去“建立数据库连接 → 用完再关闭”用连接池系统先准备好一批可复用的连接请求来了直接拿一个用完再还回池子里这样避免了频繁创建和销毁连接的高成本。一、数据库连接池是什么应用程序访问 MySQL、Oracle、PostgreSQL 这类数据库时真正执行 SQL 之前必须先建立数据库连接。而数据库连接不是“轻量对象”它通常涉及TCP 建连网络握手数据库账号认证会话初始化资源分配这些操作都比较耗时。如果每次查库都重新建连接性能会明显下降。所以就有了连接池连接池会在应用启动后预先创建若干数据库连接并维护这些连接的生命周期。业务线程需要访问数据库时从池里借一个使用完成后归还而不是直接物理关闭。二、什么时候用基本上只要是生产环境中的服务端应用访问关系型数据库时几乎都会用连接池。典型使用场景1. Web 项目比如Spring Boot MyBatisSpring Boot JPASSM 项目微服务项目用户请求很多如果每个请求都新建连接数据库和应用都会吃不消所以一定会配连接池。2. 高并发业务系统比如电商下单ERP / CRM管理后台报表系统支付、库存、订单系统连接池可以提升吞吐量减少数据库连接建立的开销。3. 长时间运行的后端服务只要应用不是一次性脚本而是持续运行的服务连接池都很有必要。三、什么时候不一定要用少数情况下可以不太关注连接池或者感知不强一次性的小脚本本地临时测试程序访问数据库次数极少的工具程序但即便如此很多框架默认也会带连接池。四、它实现了哪些核心功能连接池不只是“存几个连接”它通常实现了下面这些能力。1. 连接复用最核心的功能。线程拿到连接执行业务执行完后归还池中后续线程继续复用这个连接作用减少重复建连和断连带来的性能损耗。2. 连接数量控制连接池会限制连接的数量比如初始连接数最小空闲连接数最大活动连接数最大等待时间作用防止应用无限制创建连接把数据库打爆保护数据库资源让系统在高并发下更稳定例如 MySQL 本身允许的连接数有限如果应用不做池化控制容易报Too many connections3. 获取连接的排队与等待当连接都被占用时新请求不会立刻崩而是等待可用连接等待超时后抛异常作用给系统提供缓冲机制避免资源争抢失控。4. 空闲连接管理连接池会维护空闲连接比如保留一定数量的空闲连接长时间不用的连接可以回收空闲太多时释放一部分作用避免连接长期占资源在性能和资源占用之间做平衡5. 连接有效性检测数据库连接可能因为很多原因失效数据库重启网络闪断空闲超时被服务端断开防火墙回收连接连接池会做借出前检测空闲时检测心跳 SQL 检测例如常见测试语句SELECT1作用避免应用拿到“死连接”导致 SQL 执行失败。6. 超时控制常见超时包括获取连接超时空闲连接超时连接最大存活时间SQL 执行超时有些框架也会配合做作用防止线程长时间阻塞提升系统可恢复性。7. 泄漏检测有些代码拿了连接但没归还比如异常处理不完整连接就可能“泄漏”。连接池可以监控某个连接被占用过久是否存在未关闭连接输出告警日志作用帮助排查连接没释放的问题否则连接池很快就被耗尽。8. 监控与统计很多连接池会提供监控能力比如当前活跃连接数当前空闲连接数最大使用量平均等待时间慢 SQL 统计执行次数、错误次数作用方便运维和开发定位性能瓶颈。你图里提到的Druid就很擅长这一块它除了是连接池还带监控面板、SQL 统计、防火墙等能力。五、它有什么作用可以概括成四个关键词1. 提升性能因为连接被复用不需要每次都重新建立连接。2. 提高并发能力多个请求可以高效地从池中分配连接整体吞吐更高。3. 保护数据库限制最大连接数避免数据库因连接过多而崩溃。4. 提升稳定性通过超时、检测、回收、监控等机制减少死连接、泄漏、资源耗尽等问题。六、一个简单流程以 Spring Boot 项目为例请求访问数据库时大致流程是用户请求到达后端业务代码要执行 SQL框架向连接池申请一个连接连接池返回一个可用连接执行 MyBatis / JPA 的 SQL执行完毕后连接归还给连接池下一个请求继续复用注意这里的“关闭连接”很多时候不是真正关闭数据库物理连接而是把它放回池中。七、常见连接池有哪些Java 里常见的数据库连接池有HikariCPSpring Boot 现在默认常用性能高轻量Druid阿里出品监控能力强C3P0老牌连接池DBCPApache 的连接池常见问题为什么要用连接池Druid 和 HikariCP 区别常见参数怎么配如何排查连接池耗尽慢 SQL 怎么看八、总结你可以这样组织数据库连接池是用于统一管理和复用数据库连接的组件。因为创建数据库连接成本比较高所以系统通常会在启动时预先创建一批连接放进池中业务线程需要访问数据库时从池中获取用完后再归还而不是直接关闭。它一般用在 Web 后端、微服务、高并发系统中。它主要实现了连接复用、连接数量控制、空闲连接回收、连接有效性检测、等待超时、泄漏检测和监控统计等功能。它的作用主要是提升数据库访问性能、提高系统并发能力、保护数据库资源并增强系统稳定性。Druid 技术学习路线一、第一阶段先搞懂它是什么先建立基础认知别一上来就背配置。需要掌握的内容什么是数据库连接池为什么不能每次操作数据库都新建连接连接池和普通 JDBC 连接的区别连接池解决了什么问题性能、并发、资源控制、稳定性Druid 是什么它是一个数据库连接池不只是连接池还带SQL 监控慢 SQL 统计防火墙Web 监控页面Druid 在项目中的位置Spring Boot / Spring MyBatis 项目里Druid 位于应用程序JDBCMySQL 之间这一阶段目标你至少能回答Druid 是一个数据库连接池主要用于管理和复用数据库连接同时还提供 SQL 监控、慢 SQL 分析、连接池监控和 SQL 防火墙等能力。二、第二阶段会在项目里集成和使用这一阶段是“能跑起来”。学习内容Spring Boot 集成 Druid引入依赖配置数据源配置数据库连接参数启动项目正常访问数据库基础配置项认识常见配置先记住这几个urlusernamepassworddriver-class-nameinitialSizeminIdlemaxActivemaxWait验证 Druid 是否生效看项目是否使用 DruidDataSource启动后是否能正常建连是否比裸 JDBC 更适合长期服务运行这一阶段目标你要能独立完成在 Spring Boot 中配置 Druid连接 MySQL跑通 MyBatis / JPA 查询三、第三阶段掌握核心连接池参数这一阶段开始进入面试重点。1. 连接数量相关initialSize初始化连接数minIdle最小空闲连接数maxActive最大活动连接数maxWait获取连接最大等待时间2. 空闲连接管理timeBetweenEvictionRunsMillisminEvictableIdleTimeMillismaxEvictableIdleTimeMillis你要理解连接空闲多久会被检查空闲多久可能被回收为什么不能让大量无效连接一直占资源3. 连接校验validationQuerytestWhileIdletestOnBorrowtestOnReturn重点理解死连接是怎么出现的为什么要做连接有效性检测不同检测方式对性能和稳定性的影响4. PreparedStatement 缓存poolPreparedStatementsmaxPoolPreparedStatementPerConnectionSize要知道什么是 PSCache它在某些数据库场景下有优化作用不是所有场景都必须开这一阶段目标你不只是知道参数名而是能说出参数控制什么为什么这样配配大了/配小了会怎样四、第四阶段掌握监控功能这是 Druid 很有特色的一块。学习内容StatViewServlet 监控页面查看活跃连接数查看空闲连接数SQL 执行次数慢 SQLSession 情况WebStatFilter统计 Web-JDBC 关联监控数据看某个请求对应执行了哪些 SQLSQL 监控SQL 执行次数SQL 执行时间慢 SQL 记录错误 SQL 统计你需要会的事开启监控页面配置账号密码限制访问 IP在测试环境看 SQL 监控结果这一阶段目标你要能回答Druid 除了做连接池还能通过监控页面查看连接池状态、SQL 执行情况和慢 SQL有利于排查性能问题。五、第五阶段掌握 Druid Filter 机制这个阶段属于“进阶”。常见 Filterstat统计 SQL 执行情况wallSQL 防火墙slf4j/log4jSQL 日志输出重点学习wall它主要作用是防御危险 SQL拦截明显异常或高风险语句对 SQL 注入提供一定防护能力你要理解它不是替代参数化查询的万能安全方案真正防 SQL 注入的核心仍然是预编译、参数绑定、规范开发这一阶段目标你要知道 Druid 的 Filter 是扩展能力的核心尤其是statwall六、第六阶段掌握常见问题排查这是项目实战和面试都很爱问的。1. 连接池耗尽现象请求变慢获取连接超时系统报连接相关异常排查思路maxActive是否过小SQL 是否执行过慢是否存在慢查询是否有连接泄漏事务是否长时间不提交2. 死连接问题现象数据库重启后连接失效空闲过久后连接不可用排查思路是否配置validationQuery是否开启testWhileIdle空闲回收参数是否合理3. 慢 SQL 问题思路用 Druid 监控页看慢 SQL分析 SQL 本身看是否缺索引看是否全表扫描看分页、关联查询是否合理4. 连接泄漏现象连接数量越来越少最终无连接可用原因常见于手动 JDBC 没有关闭资源事务异常没有正确释放某些代码路径连接没归还这一阶段目标你要能把 Druid 当成“排查工具”来用而不只是配置项集合。七、第七阶段理解底层原理这一阶段适合准备中高级面试。要掌握的原理点连接借用与归还机制线程如何从连接池拿连接用完后为什么不是物理关闭而是归还池中连接池如何维护空闲连接为什么要保留最小空闲连接为什么要定时清理连接校验机制借出前检测空闲检测心跳检测监控统计原理Druid 如何拦截 SQL如何统计执行时间和次数Filter 链机制Druid 为什么能做 SQL 监控、日志、防火墙本质上是通过过滤器增强数据源能力这一阶段目标你要能从“会用”升级到“会解释为什么这样工作”。八、第八阶段对比其他连接池这个阶段主要为面试服务。至少要会对比1. Druid vs HikariCPHikariCP更轻量性能很强Spring Boot 默认更常见Druid监控能力更强SQL 统计更丰富配置和功能更全面2. Druid vs C3P0 / DBCP后两者偏老现在企业里更常见的是 HikariCP 和 Druid面试表达可以这样说如果系统更重视高性能和轻量化常用 HikariCP如果项目需要连接池监控、慢 SQL 分析、SQL 防火墙等功能Druid 也很常见。推荐学习顺序可以按这个顺序推进第 1 步数据库连接池基础JDBC 连接流程为什么需要连接池常见连接池概念第 2 步Druid 基础使用Spring Boot 集成MySQL 数据源配置跑通增删改查第 3 步核心参数配置initialSizeminIdlemaxActivemaxWaitvalidationQuerytestWhileIdle第 4 步监控页面和 SQL 统计StatViewServletWebStatFilter慢 SQL 监控第 5 步Filter 机制statwall日志 filter第 6 步问题排查连接耗尽慢 SQL死连接泄漏第 7 步源码和原理DruidDataSource连接借还流程Filter 链第 8 步面试总结为什么用 Druid常见配置项如何排查问题和 HikariCP 的区别对你当前阶段更实用的学习建议如果你是做 Java 后端项目、又是简历或面试导向我建议你重点抓这四块必学Druid 是什么为什么用连接池核心参数Spring Boot 配置重点连接有效性检测最大连接数与等待时间慢 SQL 监控监控页面使用加分项wall 防火墙Filter 机制连接泄漏排查Druid 和 HikariCP 对比源码项有时间再看不需要一开始就深挖学习路线总结你可以直接记成这句话学 Druid 可以按“连接池基础 → 项目集成 → 核心参数配置 → 监控与慢 SQL → Filter 机制 → 问题排查 → 底层原理 → 对比 HikariCP”这个路线来学。前期重点是会配置、会使用、会看监控后期重点是会排查连接池耗尽、慢 SQL、死连接和连接泄漏问题。

更多文章