弹性数据库连接池探活策略调研(一)——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的更多相关文章
- JAVA数据库连接池的革命 -- 从BoneCP到HikariCP
从BoneCP到HikariCP 今天笔者本想更新一下项目中使用到的BoneCP版本的.却无意发现jolbox网站打不开了.起初以为是被墙掉了,经过一番查找,居然在BoneCP的Github站看到了如 ...
- JAVA数据库连接池的革命 -- 从BoneCP到HikariCP(转)
从BoneCP到HikariCP 今天笔者本想更新一下项目中使用到的BoneCP版本的.却无意发现jolbox网站打不开了.起初以为是被墙掉了,经过一番查找,居然在BoneCP的Github站看到了如 ...
- springboot数据库连接池使用策略
springboot官方文档介绍数据库连接池的使用策略如下: Production database connections can also be auto-configured using a p ...
- python codis集群客户端(一) - 基于客户端daemon探活与服务列表维护
在使用codis时候,我们遇到的场景是,公司提供了HA的Proxy(例如N个),但是不暴露zookeeper(也就是说没有codis后端服务列表). 如果暴露zk的话,可以看这一篇,http://ww ...
- [数据库连接池] Java数据库连接池--DBCP浅析.
前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用数据库连接池假设网站一天有很大的访问量,数据库服务 ...
- Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式
连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...
- Java数据库连接池
转载过来的,最近在做一个小网站,准备使用这种方法. Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...
- 数据库连接池dbcp基本配置
DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要2个包: com ...
- Java jdbc数据库连接池总结!(转)
1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...
- 【Java】数据库连接池技术
JDBC的问题 在程序中,我们经常要建立与数据库的连接,之后再关闭这个连接.我们知道,数据库连接对象的创建是比较消耗系统性能的,这些频繁的操作势必会消耗大量的系统资源.因此我们需要采用更高效的数据库访 ...
随机推荐
- CreateProcess error=2, 系统找不到指定的文件。
遇到一个android 配置.gradle时提示CreateProcess error=2, 系统找不到指定的文件 于是百度有很多这类答案,如:干掉NDK 我按照这么做了,最后顽固的bug 并没有理睬 ...
- ODDO之三 :Odoo 13 开发之创建第一个 Odoo 应用
Odoo 开发通常都需要创建自己的插件模块.本文中我们将通过创建第一个应用来一步步学习如何在 Odoo 中开启和安装这个插件.我们将从基础的开发流学起,即创建和安装新插件,然后在开发迭代中更新代码来进 ...
- MySQL之常用函数介绍
一:函数的简介 函数可以把我们经常使用的代码封装起来,需要的时候直接调用即可.这样既提高了代码效率,又提高了可维护性.在SQL中我们也可以使用函数对检索出来的数据进行函数操作.使用这些函数,可以极大地 ...
- R 语言关于 SSL 证书异常处理笔记
一.关于 TCGAbiolinks TCGAbiolinks 是一个用于 TCGA 数据综合分析的 R/BioConductor 软件包,能够通过 GDC Application Programmin ...
- 微生物组分析软件 QIIME 2 安装小记
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. QIIME 2 是一个功能强大,可扩展,分散式的(decentralized)微生物组分析软件 ...
- 阿里云ASK试用心得(避坑贴)
前言 常年BP阿里云的各种服务,今天却被阿里云给上了一课,这一套组合拳把我安排的明明白白,血亏50大洋,算是提前为各位大佬排坑了,预祝大家中秋快乐 目的 最近阿里云首页放出了免费试用的活动,本着不用白 ...
- 01-C语言基础语法
目录 一. C语言发展史 二. 数据类型 三. 常量和变量 四. 字符串和转义字符 五. 选择语句 六. 循环语句 七. 函数 一. C语言发展史 1963 年ALGOL 60 作为C语言最早的模型, ...
- Python3.7源码编译
1.下载Python3.7.0源码 git clone https://github.com/python/cpython.gitgit checkout v3.7.0 wget https://ww ...
- Spring Boot 日志文件
Spring Boot 日志文件 日志文件是用于记录系统操作事件的记录文件或文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 事件日志记录系统的执行中 ...
- python笔记:第六章函数&方法
1.系统函数 由系统提供,直接拿来用或是导入模块后使用 a = 1.12386 result = round(a,2) print(result) > 1.12 2.自定义函数 函数是结构化编程 ...