1. 概述

HikariCP 是目前 Java 领域性能最优秀的数据库连接池实现之一,因其轻量、高效、稳定而被广泛使用。它由 Brett Wooldridge 开发,后来成为开源项目,并被 Spring Boot 等主流框架默认集成。

本文将带你了解 HikariCP 的核心特性、使用方式、常见配置项以及一些使用过程中需要注意的“踩坑”点,帮助你在实际项目中更好地应用它。

2. 为什么选择 HikariCP?

在众多连接池实现(如 DBCP、C3P0、Tomcat JDBC Pool)中,HikariCP 之所以脱颖而出,主要有以下几个原因:

高性能:通过底层优化(如使用 FastList 替代 ArrayList),HikariCP 在性能测试中通常优于其他连接池
低延迟:连接获取时间极短,适合高并发场景
轻量级:JAR 文件体积小,依赖少
简洁易用:API 设计清晰,配置简单
活跃维护:社区活跃,文档完善,问题响应快

缺点:功能相对较少,不提供监控页面,需要结合其他工具如 Micrometer、Prometheus 实现监控

3. 核心特性

以下是一些 HikariCP 的核心特性:

  • 自动连接回收
  • 连接泄漏检测(leak detection)
  • 只读事务优化
  • 连接池状态监控(通过 JMX)
  • 支持 JDBC 4.1+ 和 Java 8+

4. 快速入门

4.1. 引入依赖

如果你使用的是 Maven 项目,只需在 pom.xml 中添加如下依赖:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version>
</dependency>

Gradle 用户:

implementation 'com.zaxxer:HikariCP:5.0.1'

4.2. 基本配置示例

下面是一个使用 HikariCP 创建连接池的简单示例:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class HikariCPExample {
    public static void main(String[] args) {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
        config.setUsername("root");
        config.setPassword("password");
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");

        // 可选配置
        config.setMaximumPoolSize(10);
        config.setIdleTimeout(30000);
        config.setMaxLifetime(1800000);
        config.setConnectionTestQuery("SELECT 1");

        DataSource dataSource = new HikariDataSource(config);

        try (Connection conn = dataSource.getConnection()) {
            System.out.println("Connection obtained successfully.");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

5. 常用配置项详解

配置项 说明
jdbcUrl 数据库连接 URL
username 数据库用户名
password 数据库密码
driverClassName JDBC 驱动类名(可选)
maximumPoolSize 最大连接数,默认 10
minimumIdle 最小空闲连接数,默认等于 maximumPoolSize
idleTimeout 空闲连接超时时间(毫秒),默认 600000(10分钟)
maxLifetime 连接最大存活时间(毫秒),默认 1800000(30分钟)
connectionTimeout 获取连接超时时间(毫秒),默认 30000(30秒)
connectionTestQuery 测试连接是否有效的 SQL 语句,如 SELECT 1

⚠️ 建议:生产环境中务必设置 connectionTestQuery,以确保连接有效性。

6. 连接泄漏检测

HikariCP 提供了连接泄漏检测功能,通过设置 leakDetectionThreshold 可以启用:

config.setLeakDetectionThreshold(2000); // 单位:毫秒

如果一个连接被获取后在指定时间内未被释放,HikariCP 会输出警告日志,提示可能的连接泄漏。

⚠️ 注意:该功能会对性能造成轻微影响,建议仅在开发/测试环境开启。

7. 与 Spring Boot 集成

Spring Boot 2.x 开始默认使用 HikariCP 作为连接池。只需在 application.yml 中配置如下内容即可:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size: 15
      idle-timeout: 30000
      max-lifetime: 1800000
      connection-test-query: SELECT 1

Spring Boot 会自动创建 DataSource 实例,无需手动配置。

8. 常见问题与解决

8.1. 连接池耗尽

现象:获取连接超时,抛出 HikariPool.PoolInitializationExceptionSQLTransientConnectionException

原因

  • 并发请求过高,连接池配置过小
  • 数据库性能瓶颈导致连接迟迟未释放
  • 未正确关闭连接,导致连接泄漏

解决方案

  • 增大 maximumPoolSize
  • 检查数据库性能,优化慢查询
  • 开启连接泄漏检测
  • 使用监控工具(如 Prometheus + Grafana)观察连接池状态

8.2. 连接失效

现象:获取连接后执行 SQL 报错,提示连接已断开

原因

  • 数据库连接超时
  • 网络中断
  • 数据库服务重启

解决方案

  • 设置合适的 maxLifetimeidleTimeout
  • 启用 connectionTestQuery
  • 检查数据库稳定性

9. 性能调优建议

  • 合理设置最大连接数:根据数据库负载和应用并发量调整 maximumPoolSize
  • 避免连接泄漏:确保每次获取连接后都关闭(使用 try-with-resources)
  • 监控连接池状态:结合 JMX 或 Prometheus 指标监控连接池使用情况
  • 使用连接池前先测试连接:避免启动时连接失败影响业务

10. 小结

HikariCP 是一个轻量、高效的数据库连接池组件,适合高并发、低延迟的业务场景。通过合理配置和使用,可以显著提升数据库访问性能并减少连接问题。

优点

  • 高性能、低延迟
  • 简洁易用
  • 社区活跃,文档完善

缺点

  • 缺乏可视化监控界面
  • 功能相对简单,需要配合其他工具使用

建议:在实际项目中应结合监控工具使用 HikariCP,并定期检查连接池状态和配置参数,以保证数据库访问的稳定性和高效性。


原始标题:Unauthorized to Perform AWS sts:AssumeRoleWithWebIdentity – Error 403