速度上打败Druid的后起之秀—HikariCP连接池

2024-02-28 11:10

本文主要是介绍速度上打败Druid的后起之秀—HikariCP连接池,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

作者:聚IT

来源:http://suo.im/6oDWSt(点击阅读全文前往)

导读:在实际开发中我们常所熟知的数据库连接池有C3P0,DBCP、阿里Druid,等。但随着Springboot 2.0选择HikariCP作为默认数据库连接池这一事件之后,HiKariCP作为一个后起之秀出现在大众的视野中,以其速度快,性能高等特点受到很多人青睐。下面是我收集到的一些关于HikariCP的资料,用于帮助各位了解认识HiKariCP。

什么是HikariCP

HikariCP是由日本程序员开源的一个数据库连接池组件,是一个打着为“快速、简单、可靠”口号的后起之秀。

HikariCP优势亮点在哪里?

1、高性能,图中与其他数据库连接池相比,HikariCP每秒的操作数远大于其他数据库连接池

2、稳定,当切换为HikariCP连接池后更加稳定、

3、代码量少

那么为什么HikariCP会那么快?

  • 字节码精简,通过优化代码直到编译后的字节码最少,使得CPU缓存可以加载更多的程序代码。

  • 实现了一个无锁的集合类型(ConcurrentBag),来减少并发造成的资源竞争。

  • 使用了自定义的数组类型(FastList),相对与ArrayList极大地提升了性能。

  • 针对CPU的时间片算法进行优化,尽可能在一个时间片里面完成各种操作。

字节码精简

HikariCP利用了一个第三方的Java字节码修改类库Javassist来生成委托实现动态代理。通过使用Javassist生成动态代理,因为其速度更快且相比于JDK Proxy生成的字节码更少,使得CPU缓存可以加载更多的程序代码。

ConcurrentBag集合

ConcurrentBag是一个专门为连接池设计的lock-less集合,实现了比LinkedBlockingQueue、LinkedTransferQueue更好的并发性能。ConcurrentBag内部同时使用了ThreadLocal和CopyOnWriteArrayList来存储元素,其中CopyOnWriteArrayList是线程共享的。ConcurrentBag采用了queue-stealing的机制获取元素:首先尝试从ThreadLocal中获取属于当前线程的元素来避免锁竞争,如果没有可用元素则再次从共享的CopyOnWriteArrayList中获取。此外,ThreadLocal和CopyOnWriteArrayList在ConcurrentBag中都是成员变量,线程间不共享,避免了伪共享(false sharing)的发生。

FastList

使用FastList替代ArrayListFastList是一个List接口的精简实现,只实现了接口中必要的几个方法。JDK ArrayList每次调用get()方法时都会进行rangeCheck检查索引是否越界,FastList的实现中去除了这一检查,只要保证索引合法那么rangeCheck就成为了不必要的计算开销(当然开销极小)。此外,HikariCP使用List来保存打开的Statement,当Statement关闭或Connection关闭时需要将对应的Statement从List中移除。通常情况下,同一个Connection创建了多个Statement时,后打开的Statement会先关闭。ArrayList的remove(Object)方法是从头开始遍历数组,而FastList是从数组的尾部开始遍历,因此更为高效。

HikariCP 与 Druid谁强谁弱?

相信很多人都会拿阿里开源数据库连接池Druid 与 HikariCP 进行对比,笔者整合了很多网友评论之后总结出以下两点

  • hikariCP相对于Druid具有高性能得益于其最大限度的避免锁竞争。

  • 而druid功能最为全面,集成了SQL监控,黑名单拦截等功能,统计数据较为全面,具有良好的扩展性。

最后,HikariCP是否就是连接池的最佳选择?

上图是多个数据库连接池间的对比。笔者认为有更新更好的技术出现是好事,有竞争才有进步。但是在技术选型上也不是一味地跟随大流盲目追捧。要结合实际的项目场景需求,在对即将应用的技术有一定的了解认识的基础上进行选型才是最优选择。

关注程序员闪充宝后台回复“666”和“111免费领取46阶段以及实战java视频资料

看完本文有收获?请转发分享给更多人
长按识别二维码关注你在看?

这篇关于速度上打败Druid的后起之秀—HikariCP连接池的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755329

相关文章

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

MySQL连接池(Pool)常用方法详解

《MySQL连接池(Pool)常用方法详解》本文详细介绍了MySQL连接池的常用方法,包括创建连接池、核心方法连接对象的方法、连接池管理方法以及事务处理,同时,还提供了最佳实践和性能提示,帮助开发者构... 目录mysql 连接池 (Pool) 常用方法详解1. 创建连接池2. 核心方法2.1 pool.q

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

MySql中的数据库连接池详解

《MySql中的数据库连接池详解》:本文主要介绍MySql中的数据库连接池方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql数据库连接池1、概念2、为什么会出现数据库连接池3、原理4、数据库连接池的提供商5、DataSource数据源6、DBCP7、C

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

MySQL数据库连接池技术

关于数据库连接池的使用,首先我们要明白我们为什么要用它,对应普通的数据库连接操作,通常会涉及到以下一些操作是比较耗时的: 网络通讯,涉及到网络延时及协议通讯身份验证,涉及安全性检查连接合法性检查,主要是检查所连接的数据库是否存在并发控制机制构造并初始化输出缓冲区连接成功后的信息保存,日志存储服务器性能数据库配置优化系统分配内存资源等等~~~状况,导致数据库连接操作比较耗时,~~~而且每次都得花费

Redis 客户端Jedis使用---连接池

Jedis 是Redis 的Java客户端,通过一段时间的使用,jedis基本实现redis的所有功能,并且jedis在客户端实现redis数据分片功能,Redis本身是没有数据分布功能。 一、下载jedis 代码 jedis 代码地址:https://github.com/xetorthio/jedis 再次感受到开源的强大。呵呵,大家有时间可以看看源码。 二、项目中如何使用Jedi