数据源(datasource)是应用与数据库之间的桥梁,连接池则是对数据库连接进行复用管理的组件。springboot 默认使用 hikaricp,也可切换为 druid。这篇把配置、监控、调优说清楚。
一、为什么需要连接池
没有连接池: 请求进来 → 创建连接 → 执行sql → 关闭连接 (每次都要 tcp 握手,耗时 20-50ms) 有连接池: 启动时创建一批连接放在池中 请求进来 → 从池中取连接 → 执行sql → 归还到池 (省掉连接建立时间,接近 0ms)
连接池的核心参数:
- 最小空闲连接数
- 最大活跃连接数
- 连接超时时间
- 空闲连接存活时间
二、hikaricp(springboot 默认)
1. 配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/seckill_db?servertimezone=asia/shanghai&useunicode=true&characterencoding=utf-8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.driver
hikari:
# 连接池配置
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: seckillpool
register-mbeans: true # 开启 jmx 监控通过 jconsole 或 visualvm 连接到应用,可以查看连接池的状态:
- 活跃连接数
- 空闲连接数
- 等待获取连接的线程数
- 连接创建/销毁次数
三、druid(阿里,功能更丰富)
1. 引入依赖
<dependency>
<groupid>com.alibaba</groupid>
<artifactid>druid-spring-boot-starter</artifactid>
<version>1.2.20</version>
</dependency>2. 配置
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/seckill_db?servertimezone=asia/shanghai
username: root
password: 123456
driver-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: true
url-pattern: /*
exclusions: /druid/*
# druid 监控页面
stat-view-servlet:
enabled: true
login-username: admin
login-password: 123456
url-pattern: /druid/*
allow: 127.0.0.13. 监控页面
配置后访问 http://localhost:9090/druid/index.html:
- 数据源面板:连接池状态
- sql 监控:执行次数、耗时、慢sql
- url 监控:接口访问统计
- 防火墙:sql 注入防御
4. 慢sql 监控
@configuration
public class druidconfig {
@bean
public filterregistrationbean<webstatfilter> webstatfilter() {
filterregistrationbean<webstatfilter> bean = new filterregistrationbean<>();
bean.setfilter(new webstatfilter());
bean.addurlpatterns("/*");
bean.addinitparameter("exclusions", "*.js,*.css,/druid/*");
return bean;
}
}
四、连接池参数调优
1. 公式估算
/** * 最大连接数估算公式: * 核心数 × (1 + 等待时间 / 处理时间) * * 举例: * cpu 4 核,sql 执行 1ms,等待数据库返回 9ms * 最大连接数 = 4 × (1 + 9/1) = 40 * * 注意:不要设太大,过大会增加上下文切换开销 */
2. 常见配置参考
# 一般业务系统 maximum-pool-size: 20 minimum-idle: 5 # 高并发系统(如秒杀) maximum-pool-size: 50 minimum-idle: 10 # 后台管理系统(低并发) maximum-pool-size: 10 minimum-idle: 3
五、数据源加密
spring:
datasource:
password: enc(加密后的密码) # 配合 jasypt@configuration
public class datasourceconfig {
@bean
@configurationproperties(prefix = "spring.datasource")
public datasource datasource() {
return datasourcebuilder.create().build();
}
}
六、多数据源配置
spring:
datasource:
dynamic:
primary: master
datasource:
master:
url: jdbc:mysql://localhost:3306/seckill_db
username: root
password: 123456
slave:
url: jdbc:mysql://192.168.1.100:3306/seckill_db_read
username: root
password: 123456@service
@ds("slave")
public class productqueryservice {
// 查询走从库
}
七、常见问题
1. 连接泄漏
// ❌ 错误:用完连接没归还
@getmapping("/query")
public resultvo<?> query() {
connection conn = datasource.getconnection();
// 执行sql...
// 忘记 close() → 连接泄漏
return resultvo.success(data);
}
// ✅ 正确:用完关闭
public void query() {
try (connection conn = datasource.getconnection()) {
// try-with-resources 自动关闭
}
}
2. 连接超时
spring:
datasource:
hikari:
connection-timeout: 30000 # 默认 30 秒
# 如果数据库挂了,连接池会在 30 秒后报错
# 设为更小值可以快速失败
# connection-timeout: 50003. kill 连接后恢复
-- mysql 中 kill 了某个连接 -- 连接池需要心跳检测来重建连接 select 1 -- 默认的心跳检测 sql
八、hikaricp vs druid
| 对比 | hikaricp(springboot默认) | druid(阿里) |
|---|---|---|
| 性能 | ⭐⭐⭐⭐⭐ 最快 | ⭐⭐⭐⭐ 快 |
| 监控 | jmx 方式 | ✅ web 管理页面 |
| sql 分析 | ❌ 不支持 | ✅ 慢sql、防火墙 |
| 配置复杂度 | 简单 | 中等 |
| 依赖大小 | 150kb | 2mb |
建议:
- 一般项目用 hikaricp 就够了,springboot 默认省事
- 需要监控和 sql 分析 → druid(druid 监控页面很好用)
- 秒杀系统可以用 hikaricp,性能第一
九、秒杀系统连接池配置
spring:
datasource:
hikari:
maximum-pool-size: 30 # 秒杀场景适当调大
minimum-idle: 10
idle-timeout: 300000
connection-timeout: 5000 # 快速失败
max-lifetime: 1200000
connection-test-query: select 1总结
连接池的核心: 复用连接,省掉 tcp 握手开销 控制并发,防止数据库被打垮 配置原则: 不是越大越好(连接池过大会增加上下文切换) 根据 cpu 核数 + sql 执行时间估算 加监控,调优有依据
以上就是springboot实现数据源配置与连接池的两种方案的详细内容,更多关于springboot数据源配置与连接池的资料请关注代码网其它相关文章!
发表评论