一、HikariCP 源码分析之获取连接流程一

二、HikariCP 源码分析之获取连接流程二 这时候我们可以用Semaphore实现,Semaphore类似一个令牌桶,桶里可以放指定数量的令牌,在并发的时候,每个线程从桶里拿一个(也可以是多个)令牌,拿到令牌的才可以继续执行,拿不到令牌的就等着(根据策略不同,也可能是抛异常等),直到有其他线程释放令牌之后,得到令牌继续执行。比如我挂起了连接池,然后修改了 maxLifetime,那么连接池中现有的连接还是之前的配置,我就要将所有的连接都从连接池中驱逐出去,然后恢复连接池,这时候连接池就会使用新的配置创建新的连接。那么是怎么实现的呢? 阅读详情

HikariDataSource 的 getConnection()方法

HikariCP 获取连接的方法是com.zaxxer.hikari.HikariDataSource#getConnection(), 这个方法在HikariDataSource类中。HikariDataSource类中是 HikariCP 提供用户使用的主要类,有获取连接,关闭连接池,剔除连接等方法。我们主要看一下getConnection(), 这是对外暴露的获取连接的方法,不管是 Spring 获取连接还是我们自己手工调用 HikariCP,都是调用这个方法从连接池中取连接。

代码如下:

public Connection getConnection() throws SQLException {
      //①
      if (isClosed()) {
         throw new SQLException("HikariDataSource " + this + " has been closed.");
      }
      //②
      if (fastPathPool != null) {
         return fastPathPool.getConnection();
      }

      /**
       * ③
       * See http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java
       * GFC: 双重检查锁
       * https://www.cnblogs.com/xz816111/p/8470048.html
       * 如果是使用无参构造{@link #HikariDataSource()}初始化的HikariDataSource,那么默认是延迟构建HikariDataSource,
       * 在第一次获取连接的时候才构建HikariDataSource
       */
      HikariPool result = pool;
      //B才执行到这里
      if (result == null) {
         synchronized (this) {
            result = pool;
            if (result == null) {
               validate();
               //A 执行到打印日志
               LOGGER.info("{} - Started.", getPoolName());
               pool = result = new HikariPool(this);
            }
         }
      }

      return result.getConnection();
   }

其实一看,HikariDataSource 的getConnection()代码还是非常简单的,更多的细节,放在了 HikariPool 的getConnection()方法中。

但是,我们还是要分析一下的,毕竟,我们看开源代码的目的是学习大师的设计和技巧。

①检查连接池状态

//①
if (isClosed()) {
   throw new SQLException("HikariDataSource " + this + " has been closed.");
}

这里的代码主要是判断连接池是不是已经关闭了,如果isClosed()返回 true,那么连接池已经关闭, 那么直接抛出异常。虽然是一个简单的判断,其实也有值得我们学习的地方。

isClosed()方法实现只有一句代码:return isShutdown.get();,这个isShutdown其实就是一个连接池的关闭状态对吧?它有个get()方法,猜猜是个什么类型? OK,它的声明是private final AtomicBoolean isShutdown = new AtomicBoolean();。

我们知道带Atomic前缀的一些类型,都是原子操作,它是线程安全的,在高并发情况下,能保证isShutdown的值在各个线程中是一致的,类似的还有AtomicInteger,AtomicLong等等,那么AtomicBoolean就是一个线程安全的布尔类型,这样就可以保证关闭连接池的时候,其他线程可以及时的感知到。

那么线程不安全的原因是什么?

CPU 有一级缓存,二级缓存,三级缓存,还有内存。一级缓存,二级缓存,三级缓存是每个 CPU 核独享的,而内存是整个 CPU 共享的。在 CPU 计算的时候会把值从内存读取到最近的一级缓存中,这样的话,很可能在多个核之间,isShutdown的值不一致,这就是线程不安全。

那AtomicBoolean是如何保证多个核之间的线程数据一致呢?

AtomicBoolean内部,有一个private volatile int value;的属性,用于记录 Boolean 的值,0 是 false,1 是 true。关键就是volatile修饰符,可以强制 CPU 在修改value的时候,必须要同步到内存中,而读取的时候,必须要从内存中读取。这样,各个线程之间就是数据一致了吧。但是,它也有个显而易见的劣处,大家看出来了吗,那就是会比较慢,因为它每次都有从内存中读取数据,这就是性能较差,对吧?所以我们只能在需要使用volatile的时候再用,不能滥用。

在我经验不多的年纪,写类似代码标记一个状态的时候,是直接在类中定义一个类成员变量,没有用volatile。现在想来还是太年轻了,好在那些状态对实时的要求不高,也没有出现什么问题。所以我们还是要多读源码,学习前辈的经验。

不知道有没有同学会感慨,都涉及到 CPU 了,好底层啊。那么大家继续学习 HikariCP 的源码会发现,很多代码都是考虑到了非常底层的优化,比如控制了字节码的大小,方便 JVM 优化代码。另外大家也可以学习下 Disruptor 并发框架,也是一个涉及到 CPU 缓存优化的框架,好多大数据框架学习了它的设计,据说性能高到能把 CPU 跑冒烟。

越是了解底层,越能写出更好的代码。学习了这些优秀的框架,我的感慨是:那些年上大学睡的觉,终究是要还的,现在终于到时候了.......

② 两个连接池?

//②if (fastPathPool != null) {return fastPathPool.getConnection();}

这里的代码,又是非常简单,有没有设计?有!

它的实现是直接调用了fastPathPool的getConnection()方法对吧。但是请大家注意最后的 return 语句,是result.getConnection();,这个result是fastPathPool吗?看下③处HikariPool result = pool;,这个result其实是pool。那么有点奇怪,HikariDataSource 中有两个连接池?不会吧,谁会这么设计呢 !那该如何解释?

其实在 HikariDataSource 中,还真的有两个连接池的成员变量。定义如下:

privatefinal HikariPool fastPathPool;
privatevolatile HikariPool pool;

除了变量名字不同之外,他们的修饰符也不一样,fastPathPool是final的,pool是volatile的。volatile在上面已经解释过了,就是为了线程安全嘛,保证多线程情况下 pool 的值是一致的。fastPathPool呢,是final的,HikariDataSource 初始化的时候必须赋值,之后就改不了了对吧。

其实这里涉及到了 HikariCP 连接池的创建方式。HikariDataSource 有两个构造方法,第一个是无参构造:

public HikariDataSource() {
      super();
      fastPathPool = null;
   }

第二个是有参的:

public HikariDataSource(HikariConfig configuration) {
      configuration.validate();
      configuration.copyState(this);
      LOGGER.info("{} - Started.", configuration.getPoolName());
      pool = fastPathPool = new HikariPool(this);
   }

我们不在此详细解析这两个构造方法了,我们只看这两个构造方法的最后一句,无参构造的是fastPathPool = null;,有参构造的是pool = fastPathPool = new HikariPool(this);。

那么, 我们可以推断出,如果使用无参构造初始化 HikariDataSource,fastPathPool就永远是 null;如果使用有参构造初始化 HikariDataSource,那么fastPathPool就永远跟pool是一样的。

fastPathPool和pool都是HikariPool类型的对吧,HikariPool其实是代表了连接池。那么我们最初的问题,为什么使用了两个连接池的成员变量?我们在①处解析了 volatile 的劣处,性能略差,如果每次获取连接都从pool读取的话,是不是每次都要损失一些性能?所以我们在使用有参构造创建连接池的时候,将fastPathPool也赋值,那么我们从fastPathPool获取连接,相当于变相的不使用 volatile,这样就能不损耗volatile的性能。volatile的主要目的就是在创建连接池的时候,如果有多个线程同时创建,不会创建出多个连接池。我们会在下面详细描述。

除了学习到这种设计之外,我们还可以知道,使用有参构造来初始化 HikariDataSource 会有一些性能提升,官方也推荐大家使用有参构造来初始化 HikariCP。其实这种性能提升不是非常大,但是 Hikari 作者还是不放过一点点的让 HikariCP 更快的机会,这就是为什么 HikariCP 是最快的数据库连接池。

详细的性能测试结果,大家可以看下作者的回答:

https://groups.google.com/forum/#!msg/hikari-cp/yAtDD-3Qzgo/MgnNPLUkPqEJ

③双重检查锁

//③
HikariPool result = pool;
//B才执行到这里
if (result == null) {
   synchronized (this) {
      result = pool;
      if (result == null) {
         validate();
         //A 执行到打印日志
         LOGGER.info("{} - Started.", getPoolName());
         pool = result = new HikariPool(this);
      }
   }
}

return result.getConnection();

此处的代码,我相信大家都能看懂,就是检查连接池是不是 null,如果是 null,就创建一个连接池,然后从新创建的连接池中获取连接返回。

如果我只写到上面,那我就跟有一些源码解析的文章一样了,看了跟没看一样, 没有任何收获。这不是我们的目的。当初就是因为他们写的不详细,我看不明白,所以我才打算自己写,大家也才能看到这篇文章。我们的目的就是学习到代码背后的东西, 而不是写一篇这个方法调用了这个方法,那个方法调用了那个方法这种没有营养的东西,因为方法调用大家都能看懂。

闲话少叙,代码背后的东西来了。这里的设计就是:双重检查锁,英文名:double checked locking。其实在写文章之前,我也不知道它叫什么,只会写。那么,什么是双重检查锁?其实就是在加锁之前检查一下对象是否为 null,加锁之后再检查一遍对象是否为 null,这种结构就是双重检查锁。

为什么这么写?已经有了锁,肯定就只能有一个线程创建连接池啊,检查两次这不是多此一举吗?我曾经遇到一个多年经验的老手也这么问我,由于我当时不知道双重检查锁这个名字,我只能给他讲了一遍如下过程:

我们假如有两个线程(A, B)都在执行这个方法。A 执行快一点,拿到了锁,执行到了打印日志的地方,但是还没有创建连接池,此时连接池 pool 还是 null。此时 B 执行到了检查 pool 是否是 null 的地方,因为此时 pool 是 null,所以 B 要去申请锁了。A 执行完创建连接池了,此时 pool 不是 null 了,同时释放了锁。B 拿到了锁,再判断一次 pool 是否是 null,此时 pool 不是 null 了,那么就不创建连接池了。如果没有拿到锁之后的第二次判断,那么连接池会被 B 再创建一次,这才是多此一举!

还有人问:那么直接在获取锁之后检查一次就可以了,为什么还要在获取锁之前检查一次呢?

因为锁这个东西,很耗性能,如果只有一个拿到锁之后的检查的话,相当于所有线程要排队检查是不是连接池已经创建了,相当于只能排队获取连接,这是不行的,我们要高性能!在拿锁之前判断的话,如果连接池已经创建了的话,我们就直接跳过拿锁,直接获取连接了,可以多线程,高并发!

到这里,这个双重检查锁还不完美!我们继续看:

我们知道,创建一个对象,可以大体分为 3 步:

分配内存空间

初始化对象

将对象指向刚分配的内存空间

有时候编译器和 CPU 会在保证最后结果不变的情况下,对指令重排序,这就是 CPU 的乱序执行。上面的 3 步,可能会变成 132 来执行。也就是说,pool可能不是 null 了,但是它没有被初始化,这样调用的时候也会报错的。那怎么办?答案还是volatile。pool是一个volatile的,大家还记得吧?我们上面说了,它是保证线程安全的。此处还要解释volatile的第二个功能:可以阻止指令重排序。它是怎么阻止重排序的呢?它会对pool加入一个内存屏障,又称内存栅栏,是一个 CPU 指令,可以阻止对指令的重排序,所有的写(write)操作都将发生在读(read)操作之前。

这样,我们就可以完美的保证高并发下,连接池可以被正确的创建出来。

在 HikariCP 框架的使用上,我们可以得知,如果使用无参构造初始化 HikariCP,其实是一个延迟初始化,在第一次获取连接的时候,才能初始化连接池。如果大家的应用,在启动之后可能有大量请求,导致大量数据库连接创建,那么使用无参构造可以会不太合适,会导致请求有阻塞,数据库压力加大。所以,不管在什么情况下,还是要推荐大家使用有参构造初始化 HikariCP。

关于双重检查锁,大家还可以参考如下资料继续学习:

http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java

https://www.cnblogs.com/xz816111/p/8470048.html

【HikariCP源码分析】HikariCP获取链接可靠性 Hikari链接有效性? boolean isConnectionAlive(final Connection connection) { try { try { //如果支持Connection networkTimeout,则优先使用并设置 setNetworkTimeout(connection, vali... 阅读详情

相关推荐

八、HikariCP 源码分析之 ConcurrentBag 一

它是真正的保存所有的连接的地方,它是一个CopyOnWriteArrayList,在写入的时候会先复制一个 sharedList2,然后修改这个新的 sharedList2,最后将变量地址指向新的sharedList2,不是直接写入当前的sharedList,典型的空间换时间的一个做法,可以避免写入前要锁住sharedList,从而导致降低性能。生意火爆,有一天店里没车了,你去仓库提车,仓库管理员说:仓库也没车了,天通苑的连锁店里有闲着的,你去那里提吧,于是你把天通苑连锁店的车借走了。

wr_java的博客 309

HikariCP 获取连接

HikariDataSource 提供获取数据库连接的方法:getConnection(),但真正是从连接池中获取连接的,即:HikariPool#getConnection(). 获取连接的时序图如下:   #mermaid-svg-8cf8dV3tkubugsRK .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#merma

Shang_q_f的博客 2717

JAVA:Springboot 集成 Hikari 和 Druid 的技术指南

本文介绍了Java数据库连接(JDBC)及其两种主流连接池Hikari和Druid。JDBC提供访问数据库的API,包括DriverManager、Connection等核心组件。Hikari是Spring Boot默认连接池,优势在于性能优化,如精简字节码、自定义集合类型等。Druid由阿里巴巴开源,集成了监控、SQL防注入等功能,适合复杂场景。性能测试显示Hikari优于Druid,但Druid在监控和扩展性上更全面。选择建议:追求性能选Hikari,需要监控功能选Druid。

木头 5038

HikariCP:一个叫光的JDBC连接池

天不生我李淳罡,剑道万古如长夜。Hikari [hi·ka·'lē] 是日语“光”的意思。HikariCP的卖点是快、简洁、可靠,整体非常轻量,只有130Kb左右。HikariCP的出现可以说是颠覆了连接池领域,就连曾经风靡一时的BoneCP也主动停止维护,让贤于他。而且,在Spring Boot 2.0中,HikariCP凭借其优越的性能取代Tomcat成为默认的数据库连接池。

诗酒年华 7392

从SolidWorks到Simscape:URDF导出模型错位的5个常见原因及修复方法

本文深入分析了从SolidWorks导出URDF模型到Simscape时出现模型错位的5个常见原因,包括坐标系定义、RPY角陷阱、轴方向统一、质量属性导出和层次结构错乱,并提供了详细的修复方法和实战技巧,帮助工程师高效解决模型错位问题。

weixin_30664051的博客 440

游戏开发实战:如何用旋转矩阵实现2D角色平滑转向(附Unity代码)

本文深入探讨了在Unity游戏开发中,如何运用旋转矩阵原理实现2D角色的平滑转向。文章从核心理论出发,提供了计算目标旋转、实现平滑插值(Lerp与SmoothDamp)的完整C#代码,并解决了与动画系统、物理引擎协同的常见难题,帮助开发者提升游戏操作手感与视觉流畅度。

weixin_29057237的博客 287

09-HikariCP整合

池化思想分析 池化思想是我们项目开发过程中的一种非常重要的思想,如整数池,字符串池,对象池、连接池、线程池等都是池化思想的一种应用,都是通过复用对象,以减少因创建和释放对象所带来的资源消耗,进而来提升系统性能。例如Integer对象的内部池应用,代码如下: package com.cy.java.pool; public class TestInteger01 { public static void main(String[] args) { Integer n1=100;/

月亮不会睡 342

Cadence OrCAD Capture CIS元器件管理时ERROR(ORCIS-6454): Temporary part number tracking is turned on报错的解决方法

使用Part manager对工程的元器件进行批量管理时,出现如下图所示的ERROR(ORCIS-6454): Temporary part number tracking is turned on报错其解决方法如下。

fydar的博客 3498

数据库连接池HikariCP

HikariCP 现在已经有很多公司在使用HikariCP了,HikariCP还成为了SpringBoot默认的连接池,伴随着SpringBoot和微服务,HikariCP 必将迎来广泛的普及。 下面陈某带大家从源码角度分析一下HikariCP为什么能够被Spring Boot 青睐,文章目录如下: 目录 零、类图和流程图 开始前先来了解下HikariCP获取一个连接时类间的交互流程,方便下面详细流程的阅读。 获取连接时的类间交互: 图1 一、主流程1:获取连接流程 HikariCP获取连接时的入口是Hik

weixin_42526326的博客 4452

【AI智能体】QClaw 对接GitHub处理自动化任务实战操作详解

QClaw 对接GitHub处理自动化任务实战操作详解

congge 4867

编写一个程序实现顺序表的各种基本运算(假设顺序表的元数基本类型为Char)

/* *Copyright (c) 2016, 烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作者:张旺华 *完成日期: 2016 年 7 月 1 日 *版本号:v1.0 *问题描述:编写一个程序实现顺序表的各种基本运算(假设顺序表的元数基本类型为Char) * */ #include #include #include

张旺华的博客 1万+

三、HikariCP 源码分析之获取连接流程三

它看起来像是一个配置项,默认值是 500 毫秒。它是一个 java 统一的数据库连接接口,不管你使用的是 mysql 还是 oracle 等数据库,都是统一对接这个接口,都必须返回一个这个类型的连接给用户使用,相当于一个门面模式的设计,这样用户可以不理会底层使用什么数据库,代码都是一个样的。不管是使用较慢的执行 sql 检查还是 较快的 ping 命令检查,这都是一个耗时操作,所以作者设置了一个空窗期,不需要每次获取连接都检查,500 毫秒内用过该连接,那么连接还正常的可能性极大,就不检查了,提高性能。

wr_java的博客 1824

100天精通Python(可视化篇)——第98天:Pyecharts绘制多种炫酷日历图参数说明+代码实战

一、日历图介绍 二、基础配置 1. 配置项类 2. 添加函数 3. 日期标签配置 4. 坐标系配置 三、日历图实战 1. 基础日历图 2. 日历热图

努力让自己发光,对的人才能迎着光而来 2万+

HikariCP源码分析

文章目录基本用法添加依赖创建DataSource获取连接源码分析APIPool获取连接添加连接维护连接metricsdropwizardprometheus最佳实践 HikariCP是一个快速,简单可靠的JDBC连接池,SpringBoot2.0开始默认使用该数据库连接池。JDBC连接池是一种管理多连接请求的机制,换句话说,它对数据库连接进行缓存,促使连接的重用。 基本用法 要使用HikariCP, 先要添加依赖,再创建DataSource来获得连接,如果现在的DataSource过期了,也可以关闭它。 添

new_delete_的博客 2465

013 PID参数整定:Ziegler-Nichols法

几年前在调试一台伺服压机,客户要求位置精度±0.01mm,响应时间小于50ms。我按照教科书上的经验值设了P=1.5,I=0.02,D=0.01,结果电机一启动就开始尖叫,位置超调直接干到0.3mm,然后开始震荡,像极了喝醉的舞者。现场工程师看我的眼神,就像在看一个刚毕业的实习生。那次之后我明白了一个道理:PID参数不是靠猜的,也不是靠经验公式硬套的。你需要一个系统的方法,而Ziegler-Nichols法就是那个让你从“瞎调”走向“有章可循”的起点。

m0_50546716的博客 99

GD32F103 -- LIN从机通讯 -- 程序代码 (精简版)

注意!!!注意!!!这是GD32从机通讯!!!GD32!!!GD32!!!

晴朗luo的博客 2498

HikariCP连接池使用和源码分析

本文深入探讨了高性能JDBC连接池HikariCP的使用方法、配置参数、架构设计和源码实现。作为Java项目的首选连接池,HikariCP以其卓越性能和简洁设计著称。文章首先介绍了HikariCP的Maven依赖添加和基础配置方法,详细解析了常用参数如maximumPoolSize、connectionTimeout等。接着剖析了其架构设计,包括HikariDataSource、HikariPool等核心组件及其关系。最后从源码层面分析了初始化和连接获取过程,揭示了HikariCP高性能的实现原理。通过本文

shangjg3的博客 1051

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring Boot 数据库连接池HikariCP

前言 现在已经有很多公司在使用HikariCP了,HikariCP还成为了SpringBoot默认的连接池,伴随着SpringBoot和微服务,HikariCP 必将迎来广泛的普及。 下面陈某带大家从源码角度分析一下HikariCP为什么能够被Spring Boot 青睐,文章目录如下: 目录 零、类图和流程图 开始前先来了解下HikariCP获取一个连接时类间的交互流程,方便下面详细流程的阅读。 获取连接时的类间交互: 图1 一、主流程1:获取连接流程 HikariCP获取连接时

qq_24692021的博客 1600

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringBoot 默认数据库连接池 HikariCP

SpringBoot 默认数据库连接池 HikariCP,介绍、配置、性能测试

lly576403061的博客 7600

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HikariCP源码简洁剖析——HikariDataSource_HikariCP的使用和源码

文章目录HikariDataSource的作用源码剖析核心变量构造方法获取链接实例HikariCP的使用和源码简介HikariCP是什么?HikariCP 解决了哪些问题?为什么要使用 HikariCP?本文要讲什么?如何使用 HikariCP需求项目环境引入依赖编写 hikari.properties初始化连接池如何使用 JMX 管理连接池需求开启JMX启动连接池使用jconsole查看配置参数详解必需的参数常用的参数很少用的参数源码分析HikariCP为什么快?传统模型--中规中矩的模型标记模型--更少

qq_43842093的博客 3074

数据库连接池(一):HikariCP 源码解析

《【追光者系列】HikariCP 连接池监控指标实战》 《【追光者系列】Can you Read Aloud The Word Hikari Properly?》 《【追光者系列】HikariCP 默认配置》 《【追光者系列】HikariCP 连接池配多大合适(第一弹)?》 《【追光者系列】HikariCP 源码分析之 allowPoolSuspension》 《【追光者系列】Hikar...

scofen的博客 1318

hikariCP源码详解

现在已经有很多公司在使用HikariCP了,HikariCP还成为了SpringBoot默认的连接池,伴随着SpringBoot和微服务,HikariCP 必将迎来广泛的普及。

demon7552003的小本本 1508

HikariCP 源码分析:Evict、时钟回拨与连接创建生命周期

本文深入剖析了HikariCP数据库连接池的核心机制。其高性能源于三方面设计:1)智能连接驱逐机制,通过HouseKeeper线程定期扫描,结合无锁设计的ConcurrentBag和异步EvictTask实现高效清理;2)稳健的时钟回拨处理策略,采取"检测即放弃"的保守方式保障可用性;3)清晰的连接生命周期管理,通过PoolEntry的状态流转(创建、借用、归还、驱逐、关闭)形成严谨闭环。这些机制共同确保了HikariCP在资源管理和性能优化上的卓越表现,体现了优秀的工程权衡思想。

油墨香^-^的博客 1128

基于源码分析 HikariCP 常见参数的具体含义

本文从源码角度对 HikariCP 中的一些常见参数进行分析,希望能帮助大家更加清晰地理解这些参数的具体含义。

ivictor521的博客 1168

HikariCP实战 | 通过查看源码分析如何解决maxLifeTime配置问题

很多年前在stackoverflow上写过一篇文章: https://stackoverflow.com/questions/28180562/hikaricp-and-maxlifetime# hikariCP是非常优秀的JDBC connection pool. 官方配置:https://github.com/brettwooldridge/HikariCP 3、具体解决步骤(查看源码) i don’t know your HikariCP Version, but in the version 2.2

AI时代光年 4543

HikariCP源码分析之FastList

HikariCP源码分析之FastList FastList是一个List接口的精简实现,只实现了接口中必要的几个方法。JDK ArrayList每次调用get()方法时都会进行rangeCheck检查索引是否越界,FastList的实现中去除了这一检查,只要保证索引合法那么rangeCheck就成为了不必要的计算开销(当然开销极小)。此外,HikariCP使用List来保存打开的Sta...

xiaoyaGrace的博客 380
上一篇: Hikaricp和Druid对比
下一篇: 二、HikariCP 源码分析之获取连接流程二
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值