数据库连接池配置与调优
数据库连接是宝贵的资源。每次创建连接都需要TCP三次握手和MySQL认证,耗时约20-50ms。如果不使用连接池,每次查询都创建新连接,不仅性能差,还可能导致连接数耗尽。连接池通过复用连接解决了这个问题,但配置不当同样会引发问题。
HikariCP配置详解
HikariCP是Java生态性能最好的连接池,Spring Boot 2.x+默认使用。核心配置参数:
- maximumPoolSize:最大连接数。默认10。设置公式:核心数 * 2 + 磁盘数。对于大多数应用,10-20个连接就够了。设置过大反而降低性能(上下文切换开销)。
- minimumIdle:最小空闲连接数。默认与maximumPoolSize相同。建议设置为与最大连接数一致,避免连接频繁创建销毁。
- connectionTimeout:获取连接超时时间(毫秒)。默认30000(30秒)。建议设置为5000-10000ms。超时应该快速失败,而不是让请求一直等待。
- idleTimeout:空闲连接最大存活时间(毫秒)。默认600000(10分钟)。只在minimumIdle小于maximumPoolSize时生效。
- maxLifetime:连接最大生命周期(毫秒)。默认1800000(30分钟)。必须比MySQL的wait_timeout小几分钟,否则连接池持有的连接可能已被MySQL关闭。
常见问题排查
连接泄露:应用获取连接后没有正确关闭。HikariCP有泄露检测功能:设置 leakDetectionThreshold=60000,连接被借出超过60秒未归还就会打印告警日志。
连接不够用:频繁出现Connection not available异常。原因可能是:连接数设置太小、慢SQL导致连接占用时间过长、事务范围太大。解决方案:先优化慢SQL,再适当增大连接池。
连接频繁断开:MySQL主动关闭空闲连接,但连接池不知道。解决:设置maxLifetime小于MySQL的wait_timeout。HikariCP会自动淘汰过期连接并创建新连接。
监控
HikariCP通过Micrometer暴露监控指标:activeConnections(活跃连接数)、idleConnections(空闲连接数)、pendingConnections(等待连接的线程数)、connectionTimeoutCount(超时次数)。将这些指标接入Prometheus + Grafana,及时发现连接池异常。
