公司动态
SpringBoot 数据源配置与连接池——Druid vs HikariCP 实战
数据源DataSource是应用与数据库之间的桥梁连接池则是对数据库连接进行复用管理的组件。SpringBoot 默认使用 HikariCP也可切换为 Druid。这篇把配置、监控、调优说清楚。一、为什么需要连接池没有连接池 请求进来 → 创建连接 → 执行SQL → 关闭连接 每次都要 TCP 握手耗时 20-50ms 有连接池 启动时创建一批连接放在池中 请求进来 → 从池中取连接 → 执行SQL → 归还到池 省掉连接建立时间接近 0ms连接池的核心参数最小空闲连接数最大活跃连接数连接超时时间空闲连接存活时间二、HikariCPSpringBoot 默认1. 配置spring:datasource:url:jdbc:mysql://localhost:3306/seckill_db?serverTimezoneAsia/ShanghaiuseUnicodetruecharacterEncodingutf-8username:rootpassword:123456driver-class-name:com.mysql.cj.jdbc.Driverhikari:# 连接池配置maximum-pool-size:20# 最大连接数minimum-idle:5# 最小空闲连接idle-timeout:600000# 空闲超时毫秒max-lifetime:1800000# 连接最大存活时间connection-timeout:30000# 获取连接超时connection-test-query:SELECT 1# 心跳检测SQL2. 监控配置spring:datasource:hikari:pool-name:SeckillPoolregister-mbeans:true# 开启 JMX 监控通过 JConsole 或 VisualVM 连接到应用可以查看连接池的状态活跃连接数空闲连接数等待获取连接的线程数连接创建/销毁次数三、Druid阿里功能更丰富1. 引入依赖dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.20/version/dependency2. 配置spring:datasource:druid:url:jdbc:mysql://localhost:3306/seckill_db?serverTimezoneAsia/Shanghaiusername:rootpassword:123456driver-class-name:com.mysql.cj.jdbc.Driver# 连接池配置initial-size:5# 初始连接数min-idle:5# 最小空闲max-active:20# 最大活跃max-wait:30000# 获取连接超时# 监控统计filters:stat,wall# stat统计,wall防火墙filter:stat:slow-sql-millis:2000# 慢SQL阈值log-slow-sql:true# Web 监控web-stat-filter:enabled:trueurl-pattern:/*exclusions:/druid/*# Druid 监控页面stat-view-servlet:enabled:truelogin-username:adminlogin-password:123456url-pattern:/druid/*allow:127.0.0.13. 监控页面配置后访问http://localhost:9090/druid/index.html数据源面板连接池状态SQL 监控执行次数、耗时、慢SQLURL 监控接口访问统计防火墙SQL 注入防御4. 慢SQL 监控ConfigurationpublicclassDruidConfig{BeanpublicFilterRegistrationBeanWebStatFilterwebStatFilter(){FilterRegistrationBeanWebStatFilterbeannewFilterRegistrationBean();bean.setFilter(newWebStatFilter());bean.addUrlPatterns(/*);bean.addInitParameter(exclusions,*.js,*.css,/druid/*);returnbean;}}四、连接池参数调优1. 公式估算/** * 最大连接数估算公式 * 核心数 × (1 等待时间 / 处理时间) * * 举例 * CPU 4 核SQL 执行 1ms等待数据库返回 9ms * 最大连接数 4 × (1 9/1) 40 * * 注意不要设太大过大会增加上下文切换开销 */2. 常见配置参考# 一般业务系统maximum-pool-size:20minimum-idle:5# 高并发系统如秒杀maximum-pool-size:50minimum-idle:10# 后台管理系统低并发maximum-pool-size:10minimum-idle:3五、数据源加密spring:datasource:password:ENC(加密后的密码)# 配合 JasyptConfigurationpublicclassDataSourceConfig{BeanConfigurationProperties(prefixspring.datasource)publicDataSourcedataSource(){returnDataSourceBuilder.create().build();}}六、多数据源配置spring:datasource:dynamic:primary:masterdatasource:master:url:jdbc:mysql://localhost:3306/seckill_dbusername:rootpassword:123456slave:url:jdbc:mysql://192.168.1.100:3306/seckill_db_readusername:rootpassword:123456ServiceDS(slave)publicclassProductQueryService{// 查询走从库}七、常见问题1. 连接泄漏// ❌ 错误用完连接没归还GetMapping(/query)publicResultVO?query(){ConnectionconndataSource.getConnection();// 执行SQL...// 忘记 close() → 连接泄漏returnResultVO.success(data);}// ✅ 正确用完关闭publicvoidquery(){try(ConnectionconndataSource.getConnection()){// try-with-resources 自动关闭}}2. 连接超时spring:datasource:hikari:connection-timeout:30000# 默认 30 秒# 如果数据库挂了连接池会在 30 秒后报错# 设为更小值可以快速失败# connection-timeout: 50003. Kill 连接后恢复-- MySQL 中 kill 了某个连接-- 连接池需要心跳检测来重建连接SELECT1-- 默认的心跳检测 SQL八、HikariCP vs Druid对比HikariCPSpringBoot默认Druid阿里性能⭐⭐⭐⭐⭐ 最快⭐⭐⭐⭐ 快监控JMX 方式✅ Web 管理页面SQL 分析❌ 不支持✅ 慢SQL、防火墙配置复杂度简单中等依赖大小150KB2MB建议一般项目用 HikariCP 就够了SpringBoot 默认省事需要监控和 SQL 分析 → DruidDruid 监控页面很好用秒杀系统可以用 HikariCP性能第一九、秒杀系统连接池配置spring:datasource:hikari:maximum-pool-size:30# 秒杀场景适当调大minimum-idle:10idle-timeout:300000connection-timeout:5000# 快速失败max-lifetime:1200000connection-test-query:SELECT 1总结连接池的核心 复用连接省掉 TCP 握手开销 控制并发防止数据库被打垮 配置原则 不是越大越好连接池过大会增加上下文切换 根据 CPU 核数 SQL 执行时间估算 加监控调优有依据 觉得有用的话点赞 关注【张老师技术栈】吧每周更新 Java/Python/爬虫 实战干货不让你白来。