弹性数据库连接池探活策略调研(一)——HikariCP

弹性,数据库,连接池,策略,调研,hikaricp · 浏览次数 : 228

小编点评

**HikariCP 连接池探活** **简介** HikariCP 连接池会在应用程序使用连接对象时,检查连接对象的状态并进行连接池探活。如果连接对象不可用,连接池会创建一个新的连接对象并将其分配给应用程序使用。 **探活参数** 以下参数用于配置 HikariCP 连接池的探活: * **minimumIdle:**控制连接池中最小空闲连接数。默认值为 5。 * **maximumPoolSize:**控制连接池中最多容纳的最大连接数。默认值为 10。 * **maxLifetime:**控制连接在连接池中最大生命周期。默认值为 540,000。 * **idleTimeout:**控制连接在连接池中空闲时间。默认值为 48,000。 * **connectionTestQuery:**在低版本中,用于执行连接测试的 SQL 语句。默认值为 `SELECT 1`。 * **keepaliveTime:**控制每次连接探活的频率。默认值为 10分钟。 **配置** 以下是一些如何在 JED 配置模版中设置 HikariCP 连接池探活参数: ```java @Configuration public class HikariConfig { @Bean public HikariConfig configureHikariConfig() { HikariConfig config = new HikariConfig(); // 设置其他配置参数... // 设置探活参数 config.setMaximumPoolSize(10); config.setIdleTimeout(600000); config.setConnectionTestQuery("SELECT 1"); config.setKeepaliveTime(300000); return config; } } ``` **结论** HikariCP 连接池探活可以提高应用程序的性能和可伸缩性。可以通过设置合适的探活参数来优化探活效率。

正文

调研背景:

数据库连接建立是比较昂贵的操作(至少对于 OLTP),不仅要建立 TCP 连接外还需要进行连接鉴权操作,所以客户端通常会把数据库连接保存到连接池中进行复用。连接池维护到弹性数据库(JED)的长连接,弹性数据库默认不会主动关闭客户端连接(除非报错),但一般客户端到弹性数据库之间还会有负载均衡代理,它们通常为了节约连接资源会在连接空闲10分钟后主动清理连接,释放无用的连接资源。这就导致一些用户的连接池探活参数配置不当,进而拿到是已经失效的连接。客户端就会报以下错误:

基于以上的背景我们根据Java应用常用的连接池的常用版本的连接池探活相关的功能进行了调研,并对每个版本提供了JED配置的模版。目前,常用的连接池版本如下:

HikariCP 3.2.0、 3.4.5、4.0.3

DRUID 1.1.10、1.1.9、1.0.9

DBCP 1.4 、2.2.0、2.1.1

HikariCP

我们第一个章节先来介绍一下HikariCP连接池探活相关的内容:

HikariCP连接池会在需要分配连接对象给应用程序使用时,先检查连接对象的状态。为了检测连接是否可用,连接池会调用isConnectionAlive方法。如果连接对象是可用的,连接池会将连接对象分配给应用程序使用;如果连接对象不可用,连接池会创建一个新的连接对象,并将新的连接对象分配给应用程序使用。

所以HikariCP连接池的连接对象失效时,连接池只会在日志中输出警告信息,建议缩短连接对象的最大生存时间(`maxLifetime`)。但是,这并不会影响程序的正常执行,因为连接池会自动重新创建新的连接对象并分配给应用程序使用。因此,应用程序可以继续使用连接池中的连接对象,而不会受到失效连接的影响。

虽然使用HikariCP连接池时,如果不配置连接探活,应用程序在拿到失效的连接时不会报错,但是当应用程序需要执行SQL时,可能会遇到失效的连接,导致需要重新建立连接,增加了额外的性能开销。这样就没有充分发挥连接池的优势,因为连接池的主要目的是通过重复使用连接对象来提高应用程序的性能和可伸缩性。

为了最大化发挥连接池的价值,我们就一块来了解一下关于HikariCP探活相关的内容,看看如何利用相关的探活参数更高效地使用连接池。

以下是跟HikariCP探活通用的相关的参数:

参数名称 说明 默认值
minimumIdle 连接池维护的最小空闲连接数 5
maximumPoolSize 连接池中能容纳的最大连接数 10
maxLifetime 此参数用来控制连接在连接池中最大的生命周期,当建立的连接时间超过这个参数时候在空闲状态就会被销毁。 1800000 (30 minutes)
idleTimeout 此参数用来控制连接在连接池中空闲的时间,如果设置8分钟,就会每隔8分钟清理一下超过minimumIdle的空闲连接。 600000 (10 minutes)
connectionTestQuery 这个参数在低版本中只会在从池中提供连接之前执行配置的SQL。这个参数适用于不支持JDBC4 Connection.isValid() API,支持JDBC4以上驱动的建议不要配置。 none
keepaliveTime 该属性是防止底层网络基础设施超时断开,定期验证连接的有效性,如果连接失效从连接池中剔除。该值必须小于maxLifetime值。4. 0.1以上版本引入的新参数可以结合connectionTestQuery参数来探活。 0 (禁用)

HikariCP连接池的探活代码如下。可以看到,在探活时,连接池会根据isUseJdbc4Validation属性的值来决定是否走JDBC API进行探活isUseJdbc4Validation属性的值是在初始化数据源时根据connectionTestQuery属性是否为空来赋值的。如果connectionTestQuery属性为空,isUseJdbc4Validation属性的值为true,连接池会走JDBC API进行探活。因此,在JDBC 4.0及以上版本中,不建议配置connectionTestQuery属性进行探活,因为这样会影响探活的效率。

在HikariCP较低的版本中,无法对连接进行保活,只能在每次获取连接时验证连接的有效性。而在4.0.1版本中,引入了keepaliveTime参数,可以定时的对连接进行探活。因此,为避免获取到已关闭的连接,在低版本中,只能将maxLifetime参数调整到少于10分钟,才能完全避免拿到网关已经关闭的连接。在4.0.1及以上版本中,可以使用keepaliveTime参数配合connectionTestQuery参数进行连接探活,从而在获取连接之前就进行探活。这样可以提高连接的可靠性和稳定性,避免应用程序遇到无效连接的情况。

配置keepaliveTime后我们可以看到每次到配置的时间就会打印出来探活日志

因此针对线上使用HikariCP的应用推荐使用4.0.1以上支持keepaliveTime的版本。

JED配置模版:

HikariCP3.2.0

spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=10
spring.datasource.hikari.maxLifetime=540000
spring.datasource.hikari.idleTimeout=480000
#JDBC4以上的版本不建议配置connectionTestQuery
spring.datasource.hikari.connectionTestQuery=select 1

低版本中主要保证maxLifetime低于10分钟能够完全避免拿到网关已经关闭的连接,但可能会造成频繁的创建销毁连接所以建议使用4.0.1以上支持keepaliveTime的版本。

HikariCP3.4.5

同3.2.0版本。

HikariCP4.0.3

spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=10
spring.datasource.hikari.maxLifetime=1800000
spring.datasource.hikari.idleTimeout=600000
#JDBC4以上的版本不建议配置connectionTestQuery
spring.datasource.hikari.connectionTestQuery=select 1
spring.datasource.hikari.keepaliveTime=300000



4.0.1以上的版本中可以把keepaliveTime参数设置小于10分钟对连接进行探活,就能避免拿到被网关关闭的连接,maxLifetime的时间就可以延长能避免频繁的创建销毁连接。

参考文档: https://github.com/brettwooldridge/HikariCP#readme

作者:京东零售 王雷鑫

来源:京东云开发者社区 转载请注明来源

与弹性数据库连接池探活策略调研(一)——HikariCP相似的内容:

弹性数据库连接池探活策略调研(一)——HikariCP

# 调研背景: 数据库连接建立是比较昂贵的操作(至少对于 OLTP),不仅要建立 TCP 连接外还需要进行连接鉴权操作,所以客户端通常会把数据库连接保存到连接池中进行复用。连接池维护到弹性数据库(JED)的长连接,弹性数据库默认不会主动关闭客户端连接(除非报错),但一般客户端到弹性数据库之间还会有负

弹性数据库连接池探活策略调研(二)——Druid

在上一篇文章中,我们介绍了弹性数据库连接失效的背景,并探讨了HikariCP连接池探活策略的相关内容。在本文中,我们将会继续探讨另一个线上常用的连接池——Druid,并为您介绍如何在使用Druid时实现最佳实践的弹性数据库连接池探活策略。

弹性数据库连接池探活策略调研(三)——DBCP

在之前的文章中,我们介绍了弹性数据库连接失效的背景,并探讨了HikariCP、Druid连接池探活策略的相关内容。在本文中,我们将会继续探讨另一个线上常用的连接池——DBCP,并为您介绍如何在使用DBCP时实现最佳实践的弹性数据库连接池探活策略。

学node 之前你要知道这些

初识nodejs 19年年底一个偶然的机会接到年会任务,有微信扫码登录、投票、弹幕等功能,于是决定用node 来写几个服务,结果也比较顺利。 当时用看了下koa2的官方文档,知道怎么连接数据库、怎么映射表实体,怎么处理http,怎么处理异常等,就可以直接写起来了。从应用层面上来说 nodejs 入门

文盘Rust -- rust 连接云上数仓 starwift

最近想看看 rust 如何集成 clickhouse,又犯了好吃懒做的心理(不想自己建环境),刚好京东云发布了兼容ck 的云原生数仓 Starwfit,于是搞了个实例折腾一番。 Starwfit 是京东云自主研发的新一代云原生数据仓库,通过存算分离降低了存储成本,同时兼具性能和扩展弹性。其写入和查询速度可达到传统数据仓库的数倍,为用户提供实时数据分析能力。广泛应用于流量分析、精准营销、用户画像、广

华为云GaussDB以技术创新引领金融行业分布式转型

摘要:分布式数据库以大集群规模、弹性伸缩等优异特性,满足了银行业务发展的多种需求,也因此成为各大银行关键基础设施技术创新建设的首选。 今天,由北京先进数通与华为联合主办的“银行业数字化转型实践交流会“第二站在成都顺利进行,各行业专家在现场一起交流了金融行业数字化转型的技术创新和实践成果。华为中国HC

云原生时代数据库运维体系演进

数据库运维面临着大规模数据库实例难以有效运维、数据库难以做好资源弹性伸缩以及个人隐私数据安全难以保障这三个方面的挑战。对此,vivo给出了自身的应对方案。

[转帖]云原生时代数据库运维体系演进

https://www.jianshu.com/p/64019c3b09d1 作者:vivo 互联网服务器团队- Deng Song 本文根据邓松老师在“2022 vivo开发者大会"现场演讲内容整理而成。 数据库运维面临着大规模数据库实例难以有效运维、数据库难以做好资源弹性伸缩以及个人隐私数据安全

数字化时代,校园生活还可以这样过

摘要:今日校园携手华为云数据库联合打造稳定高效的数据底座服务,基于云原生数据库GaussDB(for Cassandra) 提供的超强读写、弹性扩展、便捷管理等能力,高效支撑业务稳定运行。 随着信息技术的发展,移动校园APP走入万千高校,不仅为广大师生提供了高效便捷的校园服务,也为校园生活增添了更多

业务“兔”飞猛进,只因他们做对了这件事

摘要:云原生数据库逐渐成为数据库行业的“新宠”,未来会有越来越多企业选择云原生化,云原生数据库将成为企业数字化转型的重要选择。 数据库作为企业数字化转型的基石,与云计算相结合打造了云原生数据库,云原生数据库利用云平台的优势,更能满足企业对资源弹性调度、按需使用、扩展性、性能降本增效以及各种复杂场景的