您当前的位置:首页 > 互联网教程

数据库连接池之Hikari

发布时间:2025-05-20 15:10:33    发布人:远客网络

数据库连接池之Hikari

一、数据库连接池之Hikari

Hikari连接池被誉为性能最优秀的数据库连接池,自SpringBoot2.0以来,它已成为默认的连接池选项。

autoCommit:默认值为true,表示自动提交从池中返回的连接。

connectionTimeout:等待连接池返回连接的最大毫秒数,默认为30000毫秒(30秒),最小时间为250毫秒,若小于250毫秒,则重置为30秒。

idleTimeout:连接允许在池中闲置的最长时间,默认为600000毫秒(10分钟)。若idleTimeout+1秒大于maxLifetime且maxLifetime大于0,则重置为0(代表永不退出);若idleTimeout不为0且小于10秒,则重置为10秒。只有当minimumIdle小于maximumPoolSize时,此参数才生效,当空闲连接数超过minimumIdle,且空闲时间超过idleTimeout时,则会被移除。

keepaliveTime:连接存活时间,该值必须小于maxLifetime。Keepalive只会发生在空闲连接上。当对给定连接进行keepalive的时间到达时,该连接将从池中移除。允许的最小值为30000毫秒(30秒),但理想值是在分钟范围内。默认值为0。

maxLifetime:池中连接的最长生命周期。默认为1800000毫秒(30分钟),若不等于0且小于30秒,则重置为30分钟。强烈建议设置此参数。

minimumIdle:控制连接池空闲连接的最小数量。当连接池空闲连接少于minimumIdle,且总连接数不大于maximumPoolSize时,HikariCP会尽力补充新的连接。不建议设置此值,而是让HikariCP将连接池视为固定大小的处理,默认minimumIdle与maximumPoolSize相同。当minIdle小于0或大于maxPoolSize时,则重置为maxPoolSize,默认为10。

maximumPoolSize:池中最大连接数,包括闲置和使用中的连接。默认为10。若maxPoolSize小于1,则重置。当minIdle小于等于0时,重置为DEFAULT_POOL_SIZE(10);若minIdle大于0,则重置为minIdle的值。

poolName:连接池的用户定义名称,主要用于日志记录和JMX管理控制台中的识别。默认为HikariPool-1。

readOnly:从池中获取的连接是否默认处于只读模式。默认为false。该属性的工作情况取决于数据库的实现。

connectionTestQuery:若驱动程序支持JDBC4,我们强烈建议不要设置此属性。该属性是针对不支持JDBC4 Connection.isValid() API的“传统”驱动程序。这是一个查询,在连接从池中返回给你之前会被执行,以验证与数据库的连接是否仍然有效。默认值为无。

Hikari连接池高性能的原因包括:

1、采用自定义的FastList替代了ArrayList,FastList的get方法去除了范围检查rangeCheck逻辑,并且remove方法是从尾部开始扫描的,因为Connection的打开和关闭顺序通常是相反的。

2、初始化时创建了两个HikariPool对象,一个采用final类型定义,避免在获取连接时才初始化,因为获取连接时才初始化就需要做同步处理。

3、Hikari创建连接是通过javassist动态字节码生成技术创建的,性能更优。

4、从连接池中获取连接时,对于同一个线程在threadLocal中添加了缓存,同一线程获取连接时没有并发操作。

5、Hikari最大的特点是在高并发的情况下尽量减少锁竞争。

二、druid和hikaridatasource哪个好

Druid和HikariCP都是优秀的数据库连接池,各有优势,具体选择取决于您的需求。

Druid是高性能的连接池,具有以下特点:

1.字节码精简:优化的代码,编译后的字节码最少,减少了CPU的资源。

2.优化代理和拦截器:减少代码。

3.自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都是进行范围检查,避免调用remove()时的从头到尾的扫描。

4.自定义集合类型(ConcurrentBag):提高并发读写的效率。

5.其他针对BoneCP缺陷的优化:例如对耗时超过一个CPU时间片的方法调用的研究。

6.功能全面:除了连接池功能,Druid还集成了SQL监控、黑名单拦截功能,提供了高效的数据库连接池解决方案。

7.数据库密码加密:支持PasswordCallback。

HikariCP是高性能的JDBC连接池,具有以下特点:

1.高性能:HikariCP的高性能得益于最大限度的避免锁竞争。

2.字节码增强:通过字节码增强实现了零配置和获取连接时的预初始化。

3.快速异常处理:通过快速异常处理,提高了代码执行效率。

4.数据源线程池:HikariCP的数据源是无状态的,可以使用任何线程池策略。

5.数据库连接池状态诊断:HikariCP提供了一些有用的方法来诊断连接池的状态,例如获取等待连接的线程数、获取当前连接数等。

6.支持多种数据库:HikariCP支持多种数据库,如MySQL、Oracle、PostgreSQL等。

7.自动故障切换:HikariCP支持自动故障切换,当主数据库故障时,能够自动切换到备份数据库。

综上所述,Druid和HikariCP都是优秀的数据源连接池,在性能、安全性和易用性等方面都有很好的表现。具体选择取决于您的项目需求和要解决的问题。

三、HikariCP常用监控指标与故障排查实战

1、作为数据库连接池领域的专家,资深架构师朱政科深入解析了HikariCP的关键监控指标,并分享了他在处理数据库连接问题上的实战经验。让我们一起探索HikariCP的世界,了解如何通过这些指标来诊断和优化性能。

2、hikaricp_pending_threads:当前等待连接的线程数量,高值暗示连接不足,可能引发超时和熔断。172的实例中,及时发现并重启避免了进一步影响。

3、hikaricp_connection_acquired_nanos:连接获取时间,理解其含义有助于分析性能瓶颈,代码中的详细过程包括超时处理和性能跟踪。

4、通过关注这几个指标,我们能有效定位数据库连接池的瓶颈,例如空闲连接(hikaricp_idle_connections)、活跃连接(hikaricp_active_connections)以及连接创建耗时(hikaricp_connection_creation_millis)等。

5、针对连接风暴,调整连接配置和优化业务逻辑,如减少最大连接数(maximumPoolSize)以缓解压力。

6、慢SQL问题的解决,需结合HikariCP监控和参数调整,找到性能瓶颈。

7、曹操专车案例中,连接风暴导致数据库压力增大,解决方案包括代理模式和负载均衡。

8、MySQL连接问题可能源于短连接缓存时间,通过调整wait_timeout和优化连接策略来改善。

9、当HikariCP出现异常,如关闭连接引发的"No operations allowed after connection closed",应检查验证、闲置超时、maxLifetime和无法恢复的问题。案例中,用户需细致分析,避免误判。

10、在处理Java.net.SocketException: Connection reset时,关键在于资源管理和异常处理。通过修改Java安全设置,成功解决了8万次连接请求导致的资源耗尽问题。

11、HikariCP的防御性警告和连接管理机制是问题排查的重要线索。通过代码日志追踪,可以揭示连接管理的微妙逻辑,找出问题根源,比如外部主动断开连接导致的循环。

12、通过这篇文章,你将掌握HikariCP故障排查的关键技巧,从监控指标的解读到实战案例的分析,助你成为数据库连接池问题的专家。