在上一篇《Java 数据持久化系列之池化技术》中,我们了解了池化技术,并使用 Apache-common-Pool2 实现了一个简单连接池,实验对比了它和 HikariCP、Druid 等数据库连接池的性能数据。在性能方面,HikariCP遥遥领先,而且它还是 Spring Boot 2.0 默认的数据库连接池。下面我们就来了解一下这款明星级开源数据库连接池的实现。
本文的主要内容包括:
HikariCP 简介,介绍它的特性和现况。
HikariCP 的配置项详解,分析部分配置的影响。
HikariCP 为什么这么快,介绍其优化点。
这里啰嗦两句,由于本系列会涉及很多开源项目,比如说 HikariCP、Druid、Mybatis等,所以简单聊一下我对学习开源项目的认识,这也是我自己行文或者组织系列文章顺序的思路,后续有时间再详细总结一下。
安装并检查提供的所有工具,比如 Redis 目录下的 redis-check-aof 等工具的作用,这些工具都是官方特意提供的,一般都是日常经常要使用的,了解其功能。
运行,学习所有配置项的功能,原理和优缺点,比如 Redis 的内存溢出控制策略 maxmemory-policy 的可选值都有哪些,分别对应的策略是什么含义,适用于哪些场景等。
原理研究,针对关键特性进行研究,比如 Netty 的异步 NIO 和零拷,HikariCP的高并发
优缺点对比,同类型开源产品对比,一般某一领域的开源项目往往有多个,比如说 Redis 和 Memcache,Kafka 和 RocketMQ,这些项目之间往往各有优劣,适用场景,了解了这些,也往往进一步加深了对项目关键特性和原理的研究。
demo或者性能测试,按照自己的使用场景去进行 Demo 验证和性能测试
根据demo来查看调用栈,阅读关键源码,带着问题去阅读源码,比如阅读 Redis 如何进行 aof 持久化等。
试图修改源码,只是阅读源码其实很多时候无法体会到代码为什么实现成这样,在有余力的情况下修改源码,比较实现方案,可以更好的理解实现方案,并未后续成为 commiter 打下基础。
HikariCP 简介Hikari 在日语中的含义是光,作者特意用这个含义来表示这块数据库连接池真的速度很快。官方地址是 https://github.com/brettwooldridge/HikariCP。
Hikari 最引以为傲的就是它的性能,所以作者也在贴下了很多性能数据和用户反馈。笔者也在上一篇文章中使用它的 benchmark 进行了性能对比。
从上图中可以直观的看出,Hikari 在 获取和释放 Connection 和 Statement 方法的 OPS 不是一般的高,那是相当的高,基本上是碾压其他连接池,这里就不一一点名了。
除了 OPS 外,HikariCP 的稳定性也更好,性能毛刺更少。
除了性能之外,HikariCP 在很多编码细节上也下了很多功夫。
比如说使用 JDBC4Connection 的 isValid 函数来检查 Connection 有效性,该函数使用原生的 ping 命令检查,比一般数据库连接池默认使用的 select 1 语句快一倍,性能更好。
更加遵循 JDBC 规范,在关闭 Connection 之前先关闭与之关联的 Statement 和ResultSet 等。对 JDBC 不了解的同学可以阅读本系列中第一篇文章。
对于数据库连接中断的情况,HikariCP 也处理的更加出色。作者做了实验,通过测试获取 Connection 的超时场景,各个数据库都设置了跟连接超时 connectionTimeout 类似的参数为 5 秒钟。其中 HikariCP 等待5秒钟后,如果连接还是没有恢复,则抛出一个SQLExceptions 异常,后续再获取 Connection 也是一样处理。其他数据库连接池的处理则不理想,要么是一直等到 TCP 超时才响应,比如 Dbcp2 和 C3PO,要么是需要修改默认配置,比如说 Vibur。
具体文章可以阅读 《Bad Behavior: Handling Database Down》一文(链接在文末)。
配置详解下面,我们来详细了解一下 HikariCP 的相关配置。
首先,Spring Boot 2.0 的默认数据库连接池配置就是 HikariCP,所以你无需引入其他依赖,直接在 yml 文件中进行 HikariCP 的相关配置即可。基础配置如下所示。
HikariCP 的所有配置及其默认值可以在 HikariConfig 中查看,下面我们来依次介绍较为常用的配置。
autoCommit:控制从数据库连接池返回的 Connection 是否默认事务自动提交行为,默认为 true。