做Java开发时,经常要跟ref="/tag/1/" style="color:#8B0506;font-weight:bold;">数据库打交道。如果你用的是Spring框架,光靠基础的JDBC连接,系统一忙起来就卡得不行。这时候就得靠连接池来扛住压力。连接池就像银行窗口前的排队系统,提前准备好几个柜员(数据库连接),谁来了都能快速处理,不用每次都要重新叫号、验证身份。
为什么需要连接池
没有连接池的情况下,每次请求都新建一个数据库连接,用完再关闭。这个过程耗时又占资源。特别是在高并发场景下,比如电商抢购、秒杀活动,成千上万的请求涌进来,数据库连接来不及创建,响应直接变蜗牛速度。连接池的作用就是预先创建一批连接,放着备用,用完不销毁,而是还回去继续用,大大减少开销。
Spring中常用的连接池:HikariCP
现在Spring Boot默认用的就是HikariCP,因为它快、轻量、配置简单。你只需要在配置文件里写几行,就能让它跑起来。
比如在application.yml里这样写:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
这里的maximum-pool-size是最大连接数,别设太大,不然数据库扛不住;minimum-idle是空闲时最少保持几个连接,避免冷启动延迟;后面的超时时间单位都是毫秒,按实际业务调整就行。
怎么判断连接池配得好不好
有个简单办法:看日志。如果经常出现“connection timeout”或者“pool is full”,说明最大连接数不够,或者连接没及时归还。也可能是某些SQL执行太慢,占着连接不放。这时候就得去查慢查询,优化SQL,而不是一味加大连接数。
还可以通过监控工具,比如Actuator + Prometheus,实时看连接池的使用情况。比如当前活跃连接数、等待线程数等,数据一出来,瓶颈在哪一眼就知道。
不同环境用不同配置
开发环境不需要太高性能,可以设小一点,比如最大5个连接。测试和生产环境就得认真对待了。生产环境用户多,并发高,可以设到15~20,但一定要结合数据库的实际承载能力。有时候DBA会限制单个应用的最大连接数,别自己乱调。
用application-dev.yml和application-prod.yml分开配置,启动时指定profile就行:
java -jar app.jar --spring.profiles.active=prod
别忘了健康检查
有些时候连接池里的连接看似正常,其实已经断了。比如网络抖动、数据库重启。HikariCP有自动检测机制,靠connection-test-query或validation-timeout这些参数来维护连接健康。MySQL一般不用额外写测试语句,驱动自己会处理。
如果发现应用重启后第一次访问特别慢,可能是连接池初始化太慢。可以开启initialization-fail-timeout,让启动时报错更明确。