HikariCP入门

HikariCP,以其“光”(日语中意为“光速”)之名,是目前Java世界中备受推崇的一款高性能的数据库连接池实现。作为一款轻量级且响应迅速的连接池组件,它在保证稳定性和可靠性的同时,极大地提升了应用程序访问数据库的性能。

一、HikariCP简介

HikariCP由Brett Wooldridge开发,其设计原则强调速度、稳定性以及对现代Java和JDBC特性的充分利用。相比于其他数据库连接池工具如C3P0、DBCP、HikariCP更注重性能优化,通过减少不必要的锁竞争,使用更快的数据结构以及精确的定时任务调度机制,显著降低数据库连接获取和释放的时间开销。

二、HikariCP的核心特性

  1. 超快的性能:HikariCP通过精细化的设计和优化,减少了数据库连接的创建和销毁时间,从而大大提高了系统的并发处理能力。

  2. 零-overhead连接管理:HikariCP采用了一种创新的延迟初始化策略,只有当真正需要时才创建数据库连接,有效避免了空闲连接带来的资源浪费。

  3. 健康检查与实时统计:HikariCP提供丰富的实时监控信息,包括连接池状态、连接使用情况等,便于开发者进行问题定位和性能调优。

  4. JDBC 4.1 & 4.2支持:全面支持最新的JDBC标准,包括可自定义的Statement缓存、实时数据源监控等特性。

  5. 灵活配置与扩展性: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中一些常用配置属性的详细说明:

  1. autoCommit:控制从连接池返回的连接的默认自动提交行为,布尔值,默认为true。

  2. connectionTimeout:该属性设置了客户端等待从连接池获取连接的最大毫秒数。如果超过这个时间还未获取到可用连接,则会抛出SQLException异常。最低可接受的连接超时时间为250毫秒,默认为30000毫秒(30秒)。

  3. idleTimeout:此属性控制闲置连接在池中允许存在的最大时间。仅当minimumIdle设置小于maximumPoolSize时,此设置才生效。一旦池达到最大连接数,闲置连接不会被关闭。闲置超时时限有一个±30秒的最大偏差和±15秒的平均偏差。最小允许值为10000毫秒(10秒),默认为600000毫秒(10分钟)。

  4. keepaliveTime:该属性控制HikariCP尝试保持连接活跃的频率,以防止数据库或网络基础设施将其超时断开。此值必须小于connectionTimeout。仅当连接处于空闲状态时才会执行“保持活跃”操作。当到达一个连接的“保持活跃”时间时,该连接将从池中移除,进行“ping”操作后返回到池中。“ping”操作可以是调用JDBC4方法.isValid(),或者是执行预设的connectionTestQuery查询。默认值为0(禁用),建议设置一个几分钟范围内的值。

  5. maxLifetime:此属性控制连接在池中的最大生命周期。正在使用的连接永远不会因超时而退役,只有在关闭时才会从池中移除。对于每个连接,都会进行轻微的负衰减,以避免整个池中的连接同时失效。强烈建议设置此值,并应比数据库或基础设施设定的任何连接超时限制短几秒钟。最小允许值为30000毫秒(30秒),默认为1800000毫秒(30分钟)。

  6. connectionTestQuery:如果你的驱动支持JDBC4,我们强烈建议不设置此属性。这是针对不支持JDBC4 .isValid() 方法的“遗留”驱动程序的属性。这是一个将在连接从池中分配给你之前执行的查询,用于验证到数据库的连接是否仍然存活。默认情况下为空,若驱动不支持JDBC4,HikariCP会在日志中记录错误提示。

  7. minimumIdle:该属性控制池试图维持的最小空闲连接数。如果空闲连接数量低于此值且总连接数少于maximumPoolSize,HikariCP将尽可能快速有效地添加额外连接。然而,为了获得最佳性能和应对尖峰需求的响应能力,我们建议不设置此值,而是让HikariCP作为一个固定大小的连接池运行。默认值等于maximumPoolSize

  8. maximumPoolSize:此属性控制池允许达到的最大大小,包括空闲和使用中的连接。基本上,这个值将决定到数据库后端的实际连接数。合理设置这个值取决于你的执行环境。当池达到这个大小并且没有空闲连接时,getConnection()调用将会阻塞最多connectionTimeout毫秒,然后超时。关于池大小设置,请参阅相关文档。默认值为10。

  9. metricRegistry:此属性仅可通过编程配置或IoC容器设置,允许你指定一个Codahale/Dropwizard的MetricRegistry实例,以便池记录各种指标。详情请见Metrics Wiki页面。默认为空。

  10. healthCheckRegistry:此属性同样仅可通过编程配置或IoC容器设置,允许你指定一个Codahale/Dropwizard的HealthCheckRegistry实例,用于报告当前的健康检查信息。详情请见Health Checks Wiki页面。默认为空。

  11. poolName:此属性代表用户为连接池定义的名字,主要出现在日志记录和JMX管理控制台中,用于标识各个连接池及其配置。默认为自动生成的名称。

在Spring Boot应用中,要修改HikariCP连接池的上述配置,可以通过编辑application.propertiesapplication.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高性能配置调整

  1. prepStmtCacheSize:设置MySQL驱动为每个连接缓存的预编译语句数量。默认值较为保守,为25条。我们推荐将其设置在250至500之间,这样可以提高SQL执行效率,特别是对于重复执行的SQL语句。

  2. prepStmtCacheSqlLimit:这是驱动将缓存的预编译SQL语句的最大长度。MySQL的默认值是256个字符。在实际经验中,尤其是与Hibernate这样的ORM框架一起使用时,这个默认值往往低于生成的SQL语句长度阈值。因此,我们建议将其设置为2048,以适应更长的SQL语句。

  3. cachePrepStmts:如果不开启预编译语句缓存,上述两个参数将不起作用,因为MySQL驱动默认情况下是禁用缓存的。你需要将此参数设置为true,才能启用预编译语句缓存。

  4. useServerPrepStmts:MySQL的新版本支持服务器端预编译语句,这可以显著提升性能。将此属性设置为true,以便启用服务器端预编译语句功能,从而在多次执行相同SQL结构但带有不同参数的情况下,进一步提升执行效率。

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴代庄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值