HikariCP 是一个高性能的 JDBC 数据库连接池,被广泛应用于 Java 应用程序中。它以其轻量级、快速和高效的特性而著称,适用于对性能和资源管理有较高要求的应用场景。
在使用 Spring Boot 时,可以通过 spring-boot-starter-data-jpa 或者 spring-boot-starter-jdbc 自动引入 HikariCP。Spring Boot 默认使用 HikariCP 作为数据源连接池。
在 Maven 中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>或
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>在 application.properties 或 application.yml 文件中配置数据源属性。
application.properties 示例:
spring.datasource.url=jdbc:mysql://localhost:3306/yourdatabase
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# HikariCP 特定配置
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.pool-name=HikariCPapplication.yml 示例:
spring:
datasource:
url: jdbc:mysql://localhost:3306/yourdatabase
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 5
idle-timeout: 30000
max-lifetime: 1800000
connection-timeout: 30000
pool-name: HikariCP如果需要更细粒度的控制,可以创建一个配置类:
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/yourdatabase");
config.setUsername("root");
config.setPassword("password");
config.setDriverClassName("com.mysql.cj.jdbc.Driver");
// HikariCP specific settings
config.setMaximumPoolSize(10);
config.setMinimumIdle(5);
config.setIdleTimeout(30000);
config.setMaxLifetime(1800000);
config.setConnectionTimeout(30000);
config.setPoolName("HikariCP");
return new HikariDataSource(config);
}
}jdbcUrl: 数据库连接 URLusername: 数据库用户名password: 数据库密码driverClassName: JDBC 驱动类名maximumPoolSize: 最大连接池大小minimumIdle: 最小空闲连接数idleTimeout: 连接空闲超时时间,默认 600000(10 分钟)maxLifetime: 连接的最大生命周期,默认 1800000(30 分钟)connectionTimeout: 获取连接的最大等待时间,默认 30000(30 秒)poolName: 连接池名称HikariCP 提供了一些内置的监控指标,可以集成到监控系统中,如 Prometheus、Graphite 等。这些指标包括:
Active Connections:当前正在使用的连接数Idle Connections:当前空闲的连接数Total Connections:连接池中的总连接数Threads Awaiting Connection:等待获取连接的线程数Connection Usage:连接的平均使用时间可以通过启用 HikariCP 的 MetricsTrackerFactory 来收集这些指标。例如,使用 Micrometer 进行监控:
提示:如果引入了
spring-boot-starter-actuator,Spring Boot 会自动把 HikariCP 的hikaricp.connections.*指标注册到 Micrometer,无需手动配置。下面的手动方式适用于未启用自动装配的场景(HikariCP 5.x+ 提供MicrometerMetricsTrackerFactory)。
添加依赖:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>配置类(在上文配置类基础上增加指标注册):
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import com.zaxxer.hikari.metrics.micrometer.MicrometerMetricsTrackerFactory;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource(MeterRegistry meterRegistry) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/yourdatabase");
config.setUsername("root");
config.setPassword("password");
config.setDriverClassName("com.mysql.cj.jdbc.Driver");
// HikariCP specific settings
config.setMaximumPoolSize(10);
config.setMinimumIdle(5);
config.setIdleTimeout(30000);
config.setMaxLifetime(1800000);
config.setConnectionTimeout(30000);
config.setPoolName("HikariCP");
// 注册 Micrometer 指标(须在创建数据源前设置)
config.setMetricsTrackerFactory(new MicrometerMetricsTrackerFactory(meterRegistry));
return new HikariDataSource(config);
}
}根据应用的需求和数据库的性能,可以进行一些调优:
正确设置连接池大小:
maximumPoolSize:设置为根据应用的并发需求和数据库的最大连接数来确定。minimumIdle:保持足够的空闲连接以应对突发流量。合理的超时设置:
connectionTimeout:设置为应用能够容忍的最大等待时间,避免线程长时间等待连接。idleTimeout 和 maxLifetime:根据数据库的连接超时策略和连接重用策略来设置。监控和分析:
连接泄漏检测:
leakDetectionThreshold:设置连接泄漏检测阈值,如果连接超过该时间未被关闭,将记录警告日志。# 设置为2秒(注意:properties 不支持行内 # 注释,注释必须单独成行)
spring.datasource.hikari.leak-detection-threshold=2000性能:
稳定性:
功能:
问题:应用程序没有正确关闭数据库连接,导致连接池中的连接逐渐耗尽。
解决方案:
leakDetectionThreshold 进行连接泄漏检测try (Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(sql)) {
// 执行数据库操作
} // 连接会自动关闭问题:在高并发情况下,获取连接超时。
解决方案:
maximumPoolSize 提高连接池容量connectionTimeout 设置合理的超时时间问题:所有连接都被占用,新请求无法获取连接。
解决方案:
minimumIdle 保持足够的空闲连接合理配置连接池大小:
连接数 = ((核心数 * 2) + 有效磁盘数) 作为起点设置合适的超时时间:
connectionTimeout 通常设置为 10-30 秒idleTimeout 设置为 10 分钟左右maxLifetime 设置为 30 分钟左右启用连接测试:
isValid() 校验连接,无需设置 connectionTestQueryconnectionTestQuery(如 SELECT 1)validationTimeout 控制校验超时(默认 5000,单位毫秒)spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.hikari.validation-timeout=3000配置连接池名称:
poolName监控关键指标:
HikariCP 作为一个高性能的数据库连接池,提供了简单且高效的配置选项。通过合理配置和监控,可以确保应用在高并发环境下的稳定性和性能:
通过理解和应用上述配置和调优方法,可以充分发挥 HikariCP 的优势,为应用提供强大的数据库连接管理支持。
| 特性 | 旧版(4.x) | 当前(6.x,Spring Boot 3.5.x 默认) |
|---|---|---|
| JDK | 8+ | 11+(6.x 支持 21/虚拟线程) |
| 默认配置 | maximum-pool-size 10 | 默认 10 不变;metric 上报更完善 |
| 与 Boot 3 集成 | 不支持 jakarta | 完全兼容;spring.datasource.hikari.* 配置键不变 |
| 虚拟线程 | 不支持 | 5.1+ 优化虚拟线程下连接获取性能 |
| 监控 | 基本 JMX | Micrometer 指标(hikaricp.connections.*)自动暴露 |
连接池参数调优思路(maximumPoolSize、minimumIdle、connectionTimeout、maxLifetime)在 6.x 中完全不变;注意 6.x 要求 JDK 11+,且
spring.datasource.hikari前缀配置在 Boot 3.5.x 中继续有效。