连接池怎么配置:别让数据库拖慢你的应用
最近公司项目上线后,用户一多就卡得不行。查了半天才发现,问题出在数据库连接上。每次请求都新建连接,用完就关,频繁创建销毁,资源全耗在这上面了。后来加上连接池,系统立马顺滑多了。今天就说说连接池到底该怎么配。
什么是连接池
简单讲,连接池就是提前创建好一批数据库连接,放在池子里备用。要用的时候直接从池里拿,用完还回去,不关闭。这样避免了反复建立连接的开销,响应自然快了。
常见连接池选型
Java 项目里常用的是 HikariCP、Druid、C3P0。HikariCP 性能强,配置简单,Spring Boot 默认就是它。Druid 功能更全,带监控面板,适合需要排查 SQL 性能的场景。C3P0 老项目还能见到,但现在基本被替代了。
HikariCP 基础配置示例
Spring Boot 项目中,只需要在 application.yml 里加几行:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db
username: root
password: 123456
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000maximum-pool-size 设为 20,表示最多同时 20 个连接。minimum-idle 是最少空闲连接数,保持 5 个随时可用。超时时间按业务调,一般连接超过 30 秒没拿到就报错,空闲连接 10 分钟不用就回收。
Druid 的配置要点
如果选 Druid,除了基础连接参数,还得引入依赖。配置项更多,比如可以开启 SQL 监控:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin配完之后访问 /druid 就能看到连接数、SQL 执行时间、慢查询这些数据,排错方便很多。
别盲目调大连接数
有人觉得连接越多越好,把 maximum-pool-size 设成 100 甚至 200。结果数据库扛不住,直接崩了。数据库连接也是资源,每个连接占用内存和线程。MySQL 默认最大连接才 151,你应用池子开太大,根本连不上。建议先设 20,观察高峰期使用情况,再逐步调整。
注意连接泄漏
有时候连接用了没还回去,池子慢慢就被占满,新请求拿不到连接,一直卡着。这种情况要开连接超时(leak-detection-threshold),比如 HikariCP 里设成 5000,超过 5 秒没归还就打日志,方便定位哪段代码忘了关。
线上调优要看真实数据
测试环境跑得好好的,一上生产就出问题。因为流量模式不一样。建议上线后盯几天监控,看连接使用率、等待数、超时次数。如果经常等,可能是池子小了;如果大量空闲,那就是浪费资源。根据实际负载动态调整,才是正道。