HikariCP,以其“光”(日语中意为“光速”)之名,是目前Java世界中备受推崇的一款高性能的数据库连接池实现。作为一款轻量级且响应迅速的连接池组件,它在保证稳定性和可靠性的同时,极大地提升了应用程序访问数据库的性能。
一、HikariCP简介
HikariCP由Brett Wooldridge开发,其设计原则强调速度、稳定性以及对现代Java和JDBC特性的充分利用。相比于其他数据库连接池工具如C3P0、DBCP、HikariCP更注重性能优化,通过减少不必要的锁竞争,使用更快的数据结构以及精确的定时任务调度机制,显著降低数据库连接获取和释放的时间开销。
二、HikariCP的核心特性
-
超快的性能:HikariCP通过精细化的设计和优化,减少了数据库连接的创建和销毁时间,从而大大提高了系统的并发处理能力。
-
零-overhead连接管理:HikariCP采用了一种创新的延迟初始化策略,只有当真正需要时才创建数据库连接,有效避免了空闲连接带来的资源浪费。
-
健康检查与实时统计:HikariCP提供丰富的实时监控信息,包括连接池状态、连接使用情况等,便于开发者进行问题定位和性能调优。
-
JDBC 4.1 & 4.2支持:全面支持最新的JDBC标准,包括可自定义的Statement缓存、实时数据源监控等特性。
-
灵活配置与扩展性:HikariCP提供了丰富的配置选项以适应不同场景的需求,并具有良好的扩展接口供开发者根据实际需求进行定制化开发。
三、HikariCP的应用实践
引入依赖
Java 11+ maven 工件:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.1.0</version>
</dependency>
Java 8 maven 工件(维护模式):
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
Java 7 maven 工件(维护模式):
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java7</artifactId>
<version>2.4.13</version>
</dependency>
Java 6 maven 工件(维护模式):
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java6</artifactId>
<version>2.3.13</version>
</dependency>
配置
以下是对HikariCP中一些常用配置属性的详细说明:
-
autoCommit
:控制从连接池返回的连接的默认自动提交行为,布尔值,默认为true。 -
connectionTimeout
:该属性设置了客户端等待从连接池获取连接的最大毫秒数。如果超过这个时间还未获取到可用连接,则会抛出SQLException异常。最低可接受的连接超时时间为250毫秒,默认为30000毫秒(30秒)。 -
idleTimeout
:此属性控制闲置连接在池中允许存在的最大时间。仅当minimumIdle
设置小于maximumPoolSize
时,此设置才生效。一旦池达到最大连接数,闲置连接不会被关闭。闲置超时时限有一个±30秒的最大偏差和±15秒的平均偏差。最小允许值为10000毫秒(10秒),默认为600000毫秒(10分钟)。 -
keepaliveTime
:该属性控制HikariCP尝试保持连接活跃的频率,以防止数据库或网络基础设施将其超时断开。此值必须小于connectionTimeout
。仅当连接处于空闲状态时才会执行“保持活跃”操作。当到达一个连接的“保持活跃”时间时,该连接将从池中移除,进行“ping”操作后返回到池中。“ping”操作可以是调用JDBC4方法.isValid()
,或者是执行预设的connectionTestQuery
查询。默认值为0(禁用),建议设置一个几分钟范围内的值。 -
maxLifetime
:此属性控制连接在池中的最大生命周期。正在使用的连接永远不会因超时而退役,只有在关闭时才会从池中移除。对于每个连接,都会进行轻微的负衰减,以避免整个池中的连接同时失效。强烈建议设置此值,并应比数据库或基础设施设定的任何连接超时限制短几秒钟。最小允许值为30000毫秒(30秒),默认为1800000毫秒(30分钟)。 -
connectionTestQuery
:如果你的驱动支持JDBC4,我们强烈建议不设置此属性。这是针对不支持JDBC4.isValid()
方法的“遗留”驱动程序的属性。这是一个将在连接从池中分配给你之前执行的查询,用于验证到数据库的连接是否仍然存活。默认情况下为空,若驱动不支持JDBC4,HikariCP会在日志中记录错误提示。 -
minimumIdle
:该属性控制池试图维持的最小空闲连接数。如果空闲连接数量低于此值且总连接数少于maximumPoolSize
,HikariCP将尽可能快速有效地添加额外连接。然而,为了获得最佳性能和应对尖峰需求的响应能力,我们建议不设置此值,而是让HikariCP作为一个固定大小的连接池运行。默认值等于maximumPoolSize
。 -
maximumPoolSize
:此属性控制池允许达到的最大大小,包括空闲和使用中的连接。基本上,这个值将决定到数据库后端的实际连接数。合理设置这个值取决于你的执行环境。当池达到这个大小并且没有空闲连接时,getConnection()
调用将会阻塞最多connectionTimeout
毫秒,然后超时。关于池大小设置,请参阅相关文档。默认值为10。 -
metricRegistry
:此属性仅可通过编程配置或IoC容器设置,允许你指定一个Codahale/Dropwizard的MetricRegistry
实例,以便池记录各种指标。详情请见Metrics Wiki页面。默认为空。 -
healthCheckRegistry
:此属性同样仅可通过编程配置或IoC容器设置,允许你指定一个Codahale/Dropwizard的HealthCheckRegistry
实例,用于报告当前的健康检查信息。详情请见Health Checks Wiki页面。默认为空。 -
poolName
:此属性代表用户为连接池定义的名字,主要出现在日志记录和JMX管理控制台中,用于标识各个连接池及其配置。默认为自动生成的名称。
在Spring Boot应用中,要修改HikariCP连接池的上述配置,可以通过编辑application.properties
或application.yml
配置文件来进行。以下是对应各个属性的键值对示例以及如何在application.properties
文件中进行配置:
# Spring Boot 配置文件 application.properties 中的 HikariCP 连接池配置示例
# 自动提交行为,默认为 true
spring.datasource.hikari.auto-commit=true/false
# 连接超时(毫秒),默认30秒
spring.datasource.hikari.connection-timeout=30000
# 空闲超时(毫秒),默认10分钟
spring.datasource.hikari.idle-timeout=600000
# 保持活动(心跳检测)间隔(毫秒),默认禁用
spring.datasource.hikari.keepalive-time=30000 # 若要启用并设置相应值
# 连接的最大生命周期(毫秒),默认30分钟
spring.datasource.hikari.max-lifetime=1800000
# 连接测试查询(如果驱动不支持 isValid() 方法),默认为空
spring.datasource.hikari.test-query=SELECT 1
# 最小空闲连接数,若未设置则等于最大连接数
spring.datasource.hikari.minimum-idle=5 # 根据需要设置
# 连接池最大大小
spring.datasource.hikari.maximum-pool-size=15 # 根据需要设置
# 数据源URL、用户名和密码
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=myusername
spring.datasource.password=mypassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 对应MySQL驱动
# 如果需要注册HikariCP的JMX管理
# spring.datasource.hikari.register-mbeans=true
# 其他可能的高级配置,如:
# spring.datasource.hikari.pool-name=MyHikariPoolName # 设置自定义的连接池名称
Mysql高性能配置调整
-
prepStmtCacheSize
:设置MySQL驱动为每个连接缓存的预编译语句数量。默认值较为保守,为25条。我们推荐将其设置在250至500之间,这样可以提高SQL执行效率,特别是对于重复执行的SQL语句。 -
prepStmtCacheSqlLimit
:这是驱动将缓存的预编译SQL语句的最大长度。MySQL的默认值是256个字符。在实际经验中,尤其是与Hibernate这样的ORM框架一起使用时,这个默认值往往低于生成的SQL语句长度阈值。因此,我们建议将其设置为2048,以适应更长的SQL语句。 -
cachePrepStmts
:如果不开启预编译语句缓存,上述两个参数将不起作用,因为MySQL驱动默认情况下是禁用缓存的。你需要将此参数设置为true
,才能启用预编译语句缓存。 -
useServerPrepStmts
:MySQL的新版本支持服务器端预编译语句,这可以显著提升性能。将此属性设置为true
,以便启用服务器端预编译语句功能,从而在多次执行相同SQL结构但带有不同参数的情况下,进一步提升执行效率。