网站首页 > 博客文章 正文
导读:在实际开发中我们常所熟知的数据库连接池有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是否就是连接池的最佳选择?
上图是多个数据库连接池间的对比。笔者认为有更新更好的技术出现是好事,有竞争才有进步。但是在技术选型上也不是一味地跟随大流盲目追捧。要结合实际的项目场景需求,在对即将应用的技术有一定的了解认识的基础上进行选型才是最优选择。
感谢您的阅读,如果喜欢本文欢迎关注和转发,本头条号将坚持原创,持续分享IT技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步。
猜你喜欢
- 2024-10-17 SpringBoot+Vue3+MySQL集群 开发健康体检双系统(完结)
- 2024-10-17 再有人问你数据库连接池的原理,这篇文章甩给他!
- 2024-10-17 详解Spring Boot并发处理能力:理论与参数设置实践
- 2024-10-17 数据库连接池有什么用?springboot中如何使用?
- 2024-10-17 谈谈高并发系统的一些解决方案(高并发系统设计的三大目标)
- 2024-10-17 微服务事务管理艺术:Spring Boot 集成 Seata 深度指南
- 2024-10-17 阿里巴巴开源数据库jdbc连接池 Druid 1.1.18 发布
- 2024-10-17 【架构之路】提升后端接口性能的实战技巧
- 2024-10-17 「解密」有人要将“高并发”拉下“神坛”!
- 2024-10-17 MySQL连接优化是数据库性能调优的重要一环
你 发表评论:
欢迎- 370℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 369℃用AI Agent治理微服务的复杂性问题|QCon
- 360℃初次使用IntelliJ IDEA新建Maven项目
- 352℃Maven技术方案最全手册(mavena)
- 349℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 348℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 346℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 344℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)