连接池怎么配置:实战经验分享

连接怎么配置:别让数据库拖慢你的应用

最近公司项目上线后,用户一多就卡得不行。查了半天才发现,问题出在数据库连接上。每次请求都新建连接,用完就关,频繁创建销毁,资源全耗在这上面了。后来加上连接池,系统立马顺滑多了。今天就说说连接池到底该怎么配。

什么是连接池

简单讲,连接池就是提前创建好一批数据库连接,放在池子里备用。要用的时候直接从池里拿,用完还回去,不关闭。这样避免了反复建立连接的开销,响应自然快了。

常见连接池选型

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: 1800000

maximum-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 秒没归还就打日志,方便定位哪段代码忘了关。

线上调优要看真实数据

测试环境跑得好好的,一上生产就出问题。因为流量模式不一样。建议上线后盯几天监控,看连接使用率、等待数、超时次数。如果经常等,可能是池子小了;如果大量空闲,那就是浪费资源。根据实际负载动态调整,才是正道。