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

这篇具有很好参考价值的文章主要介绍了弹性数据库连接池探活策略调研(一)——HikariCP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

调研背景:

数据库连接建立是比较昂贵的操作(至少对于 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

作者:京东零售 王雷鑫

来源:京东云开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-695818.html

到了这里,关于弹性数据库连接池探活策略调研(一)——HikariCP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据库原理】(24)数据库安全性策略

    数据库安全性是数据库管理系统(DBMS)中一个至关重要的方面。它指的是保护数据库免受非授权访问和恶意操作,包括数据泄露、修改、破坏等。 在典型的计算机系统安全模型中,安全措施被设置在不同层级: 应用程序层 :如数据库管理系统,实施特定的安全策略。 数据

    2024年01月16日
    浏览(37)
  • MYSQL数据库各种备份策略

    数据库备份,数据库为school,素材如下 1.创建student和score表 2.为student表和score表增加记录 3.备份数据库school到/backup目录 4.备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库 [root@localhost ~]# mysqldump -uroot -p123456 -B school --add-drop-table /

    2024年02月16日
    浏览(50)
  • HBase的数据库备份与恢复策略

    HBase是一个分布式、可扩展、高性能的列式存储系统,基于Google的Bigtable设计。它是Hadoop生态系统的一部分,可以与HDFS、MapReduce、ZooKeeper等组件集成。HBase具有高可用性、高可扩展性和高性能等优势,适用于大规模数据存储和实时数据处理。 在实际应用中,数据备份和恢复是

    2024年02月19日
    浏览(60)
  • 缓存更新策略,先更新数据库还是缓存呢?

    学了这么多,相信大家对缓存更新的策略都已经有了清晰的认识。最后稍稍总结一下。 缓存更新的策略主要分为三种: Cache aside Cache aside 也就是 旁路缓存 ,是比较常用的缓存策略。 (1) 读请求 常见流程 应用首先会判断缓存是否有该数据,缓存命中直接返回数据,缓存未

    2024年02月12日
    浏览(42)
  • 【Jetpack】Room 中的销毁重建策略 ( 创建临时数据库表 | 拷贝数据库表数据 | 删除旧表 | 临时数据库表重命名 )

    在 Android 中使用 Room 操作 SQLite 数据库 , 如果 SQLite 数据库表 修改比较繁琐 , 如 : 涉及到 修改 数据库表字段的数据类型 , 需要逐个修改数据库值 ; 该环境下 使用 销毁 和 重建策略 是 最佳的方案 ; 销毁 和 重建策略 执行步骤 : 以 Table 表为例 , 要对 Table 表中的数据进行繁琐的

    2024年02月08日
    浏览(54)
  • mysql面试题30:什么是数据库连接池、应用程序和数据库建立连接的过程、为什么需要数据库连接池、你知道哪些数据库连接池

    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 数据库连接池是一种用于管理和复用数据库连接的技术。它是在应用程序和数据库之间建立一组数据库连接,并以池的形式存储起来,每当应用程序需

    2024年02月07日
    浏览(57)
  • redis的缓存更新策略以及如何保证redis与数据库的数据一致性

    redis的缓存更新策略有这么几种: 1、由应用直接和redis以及数据库相连接:         查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;         更新数据时,由应用去触发redis数据的删除以及数据库的update。 2、应用只跟redi

    2024年02月13日
    浏览(57)
  • 缓存与数据库双写一致性几种策略分析

    作者:京东零售 于泷 在高并发场景中,为防止大量请求直接访问数据库,缓解数据库压力,常用的方式一般会增加缓存层起到缓冲作用,减少数据库压力。引入缓存,就会涉及到缓存与数据库中数据如何保持一致性问题,本文将对几种缓存与数据库保证数据一致性的使用方

    2023年04月19日
    浏览(49)
  • LabVIEW数据库-连接数据库

    LabVIEW数据库连接工具包访问数据库时,一般遵循连接数据库-操作数据库-断开连接数据库的流程。 LabVIEW可基于ODBC或ADO来访问数据库。 ODBC标准通过DSN连接数据库,ADO和OLE DB是通过UDL连接数据库。 标准/方案 描述 ODBC 只访问关系数据库;使用DSN连接数据库 OLEDB 微软提供的到各

    2024年02月05日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包