弹性数据库连接池探活策略调研(一)——HikariCP | 京东云技术团队

京东云开发者
• 阅读 434

调研背景:

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

弹性数据库连接池探活策略调研(一)——HikariCP | 京东云技术团队

基于以上的背景我们根据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 | 京东云技术团队

虽然使用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 | 京东云技术团队

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

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

弹性数据库连接池探活策略调研(一)——HikariCP | 京东云技术团队

因此针对线上使用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

作者:京东零售 王雷鑫

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

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
Tomcat8.5&Mysql8.0配置数据库连接池(DBCP)
DBCP(DataBaseconnectionpool),数据库连接池。是apache上的一个java连接池项目,也是tomcat使用的连接池组件。由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。百度百科(htt
Stella981 Stella981
3年前
Spring Boot + Spring Cloud 实现权限管理系统 后端篇(七):集成 Druid 数据源
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。通过数据库连接池能明显提高对数据库操作的性能。在Java应用程序开发中,常用的连接池有DBCP、C3P0、Proxool等。SpringBoot默认提供
Wesley13 Wesley13
3年前
MYSQL进阶学习笔记十四:MySQL 应用程序优化!(视频序号:进阶_32)
知识点十五:MySQL 的应用程序优化(32)一、访问数据库采用连接池把连接当做对象或设备,统一放在‘连接池’里。凡是需要访问数据库的地方都从连接池里取连接二、采用缓存减少对于MySQL的访问:         
Stella981 Stella981
3年前
Spring Boot:集成Druid数据源
综合概述数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。通过数据库连接池能明显提高对数据库操作的性能。在Java应用程序开发中,常用的连接池有DBCP、C3P0、Proxool等。Spri
Stella981 Stella981
3年前
SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
作为后台服务开发,在日常工作中我们天天都在跟数据库打交道,一直在进行各种CRUD操作,都会使用到数据库连接池。按照发展历程,业界知名的数据库连接池有以下几种:c3p0、DBCP、TomcatJDBCConnectionPool、Druid等,不过最近最火的是HiKariCP。HiKariCP号称是业界跑得最快的数据库连接池,自从Spring
Stella981 Stella981
3年前
HikariCP
数据库连接池技术数据库连接池负责分配、管理和释放数据库的连接。1.数据库连接复用。重复使用现有的数据库连接,可以避免连接频繁建立、关闭的开销。2.统一的连接管理。释放空闲时间超过最大空闲时间的数据库连接,避免因为没有释放数据库连接而引起的数据库连接泄漏。HikariCP字节码精简:优化代码,直到编译后的字节码最少
Wesley13 Wesley13
3年前
Mysql高级
Mysql高级day031\.应用优化前面章节,我们介绍了很多数据库的优化措施。但是在实际生产环境中,由于数据库本身的性能局限,就必须要对前台的应用进行一些优化,来降低数据库的访问压力。1.1使用连接池对于访问数据库来说,建立连接的代价是比较昂贵的,因为我们频繁的创建关闭连接,是比较耗费资源
Stella981 Stella981
3年前
Linux应急响应(二):捕捉短连接
0x00前言​短连接(shortconnnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。在系统维护中,一般很难去察觉,需要借助网络安全设备或者抓包分析,才能够去发现。0x01应急场景​
弹性数据库连接池探活策略调研(二)——Druid | 京东云技术团队
前言在中,我们介绍了弹性数据库连接失效的背景,并探讨了HikariCP连接池探活策略的相关内容。在本文中,我们将会继续探讨另一个线上常用的连接池——Druid,并为您介绍如何在使用Druid时实现最佳实践的弹性数据库连接池探活策略。DruidDruid的版
弹性数据库连接池探活策略调研(三)——DBCP | 京东云技术团队
在之前的文章中,我们介绍了弹性数据库连接失效的背景,并探讨了HikariCP、Druid连接池探活策略的相关内容。在本文中,我们将会继续探讨另一个线上常用的连接池——DBCP,并为您介绍如何在使用DBCP时实现最佳实践的弹性数据库连接池探活策略。