【HikariCP】【HikariDataSource】源码学习

HikariDataSource和DruidDataSource在性能、功能和使用场景区别 HikariDataSource和DruidDataSource在性能、功能和使用场景上有显著区别。HikariDataSource:适用于对性能要求极高的场景,如高并发、低延迟要求的系统DruidDataSource:适用于需要详细监控数据库操作的应用 阅读详情

Hikari目前已经是springboot的默认数据库连接池,并且以高效和轻量著称,因为代码量比较少,所以可以阅读一下,学习一下,github地址:HikariCP

HikariDataSource

成员变量

  • private final AtomicBoolean isShutdown = new AtomicBoolean();

线程安全的连接池是否关闭的标识符

  • private final HikariPool fastPathPool;

通过传入的配置创建的实际连接池的对象引用

  • private volatile HikariPool pool;

通过自身的配置创建的实际连接池的对象引用,注意这里的volatile,这个是为双重检查锁定模式使用的

构造器

  • 默认构造器
public HikariDataSource()
{
  super();
  fastPathPool = null;
}

默认构造器可以看到是将配置设置一下默认值,然后初始化一下HikariPool为null

  • 带参构造器
public HikariDataSource(HikariConfig configuration)
{
  configuration.validate();
  configuration.copyStateTo(this);

  LOGGER.info("{} - Starting...", configuration.getPoolName());
  pool = fastPathPool = new HikariPool(this);
  LOGGER.info("{} - Start completed.", configuration.getPoolName());

  this.seal();
}

首先是对传入的配置参数进行检查是否符合要求,如果符合要求将参数复制到本对象中,然后开始创建线程池,将创建的线程池的引用赋给fastPathPool,然后将是否封闭的值改成true防止被恶意修改

数据库连接池实现方法

  • public Connection getConnection() throws SQLException
@Override
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
  HikariPool result = pool;
  if (result == null) {
     synchronized (this) {
        result = pool;
        if (result == null) {
           validate();
           LOGGER.info("{} - Starting...", getPoolName());
           try {
              pool = result = new HikariPool(this);
              this.seal();
           }
           catch (PoolInitializationException pie) {
              if (pie.getCause() instanceof SQLException) {
                 throw (SQLException) pie.getCause();
              }
              else {
                 throw pie;
              }
           }
           LOGGER.info("{} - Start completed.", getPoolName());
        }
     }
  }

  return result.getConnection();
}

首先检查该连接池是否已经关闭,就是成员变量的isShutdown的值。如果已经关闭,抛出已经关闭的异常。如果连接池初始化成功的话,直接调用连接池的getConnection()方法返回。如果没有初始化,那么通过自身的配置信息初始化一个数据库连接池赋给pool字段。然后用这个新创建的连接池返回连接。
这里代码那么长主要是因为用了双重检查锁定模式,防止在多线程的情况中初始化一个不完整的数据库连接池。具体双重检查锁定模式的意义和实现,作者在代码中加了它的维基百科地址:双重检查锁定模式

  • public T unwrap(Class iface) throws SQLException
@Override
@SuppressWarnings("unchecked")
public <T> T unwrap(Class<T> iface) throws SQLException
{
  if (iface.isInstance(this)) {
     return (T) this;
  }

  HikariPool p = pool;
  if (p != null) {
     final DataSource unwrappedDataSource = p.getUnwrappedDataSource();
     if (iface.isInstance(unwrappedDataSource)) {
        return (T) unwrappedDataSource;
     }

     if (unwrappedDataSource != null) {
        return unwrappedDataSource.unwrap(iface);
     }
  }

  throw new SQLException("Wrapped DataSource is not an instance of " + iface);
}

这个方法是为了将连接池转换成指定的数据库连接池类型,如果是的,进行强制转换后返回

  • public boolean isWrapperFor(Class<?> iface) throws SQLException
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException
{
  if (iface.isInstance(this)) {
     return true;
  }

  HikariPool p = pool;
  if (p != null) {
     final DataSource unwrappedDataSource = p.getUnwrappedDataSource();
     if (iface.isInstance(unwrappedDataSource)) {
        return true;
     }

     if (unwrappedDataSource != null) {
        return unwrappedDataSource.isWrapperFor(iface);
     }
  }

  return false;
}

这个方法是来判断当前的对象是不是指定类的实例

HikariConfigMXBean接口方法

  • public void setMetricRegistry(Object metricRegistry)
@Override
public void setMetricRegistry(Object metricRegistry)
{
  boolean isAlreadySet = getMetricRegistry() != null;
  super.setMetricRegistry(metricRegistry);

  HikariPool p = pool;
  if (p != null) {
     if (isAlreadySet) {
        throw new IllegalStateException("MetricRegistry can only be set one time");
     }
     else {
        p.setMetricRegistry(super.getMetricRegistry());
     }
  }
}

设置度量标准注册表,先调用父类HikariConfig的set方法来检查和设置,如果没有问题、连接池也初始化完成并且没有设置过,就可以进行参数的设置

  • public void setMetricsTrackerFactory(MetricsTrackerFactory metricsTrackerFactory)

同上

  • public void setHealthCheckRegistry(Object healthCheckRegistry)

同上

连接池特殊方法

  • public boolean isRunning()
public boolean isRunning()
{
  return pool != null && pool.poolState == POOL_NORMAL;
}

检查连接池是否正在运行,判断条件是连接池存在并且状态是正常状态

  • public void evictConnection(Connection connection)
public void evictConnection(Connection connection)
{
  HikariPool p;
  if (!isClosed() && (p = pool) != null && connection.getClass().getName().startsWith("com.zaxxer.hikari")) {
     p.evictConnection(connection);
  }
}

将指定的连接从连接池中去除。判断条件是连接池没有关闭并且连接池存在并且这个连接是hikari数据库连接池的连接,以上为真的情况下,调用HikariPool的方法去除该连接

  • public void close()
@Override
public void close()
{
  if (isShutdown.getAndSet(true)) {
     return;
  }

  HikariPool p = pool;
  if (p != null) {
     try {
        LOGGER.info("{} - Shutdown initiated...", getPoolName());
        p.shutdown();
        LOGGER.info("{} - Shutdown completed.", getPoolName());
     }
     catch (InterruptedException e) {
        LOGGER.warn("{} - Interrupted during closing", getPoolName(), e);
        Thread.currentThread().interrupt();
     }
  }
}

关闭连接池,先判断是否已经关闭,如果是的就结束,如果不是,调用HikariPool的shutdown()方法进行关闭。这里比较特殊的是getAndSet()这个方法,因为涉及到原子类的赋值和取值,所以稍微有一点复杂

SpringBoot启动失败:出现错误——HikariPool-1 - Shutdown initiated...后立即出现 HikariPool-1 - Shutdown completed. 问题: . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ 阅读详情

相关推荐

HikariCP连接池初始化原理与性能优化实战

数据库连接池是Java应用性能优化的核心技术之一,它通过复用已建立的数据库连接,避免了频繁创建和销毁连接带来的巨大开销。其核心原理是在应用启动时预先创建一定数量的连接并维护在池中,当需要时直接获取空闲连接,使用完毕后归还而非关闭,从而显著提升系统响应速度和数据库并发处理能力。在高并发场景下,连接池能有效防止数据库因连接数暴涨而崩溃,是保障应用稳定性的关键组件。HikariCP作为当前性能最优的Java数据库连接池实现,以其极致的速度和轻量级设计著称,被Spring Boot等主流框架选为默认连接池。本文将从

weixin_33896726的博客 353

HikariDataSource

DataSourceConfiguration 配置类,springBoot默认采用HikariDataSource /** * Hikari DataSource configuration. */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(HikariDataSource.class) @ConditionalOnMissingBean(DataSource.class) @ConditionalOnProp

qq_37436172的博客 1万+

HikariCP连接池分析内部分享

HikariCP连接池分享 希望可以带着大家了解HikariCP连接池,并对线上问题给出解决思路和方案。然后可以自己去看一下HikariCP,个人感觉HikariCP实现的比较精巧,代码很值得一读,我这里会给出整体的设计和一些主流程,可以减少大家深入HikariCP的时间。 为什么分享HikariCP连接池? 线上问题:获取连接池失败? 结果:整个服务在一段时间不可用 引出了这些问题,是我想到的一些问题,也是我的解决问题的思路 1、什么是连接池? 2、为什么用连接池? 3、为什么用HikariCP连接池?

qq_30400779的博客 2330

Spring Boot 默认数据源 HikariDataSource 与 JdbcTemplate 初遇

目录 环境准备 新建项目 pom. xml 默认内容 mysql 数据库 数据库 CRUD 全局配置文件 默认数据源 CRUD 数据库 PhoneController 测试结果 自动配置原理 DataSourceConfiguration 1、《Spring Boot 数据库访问 简介》中已经介绍,Spring Boot 可以通过多种方式访问各种数据库,本文将介绍 Spr...

蚩尤后裔-汪茂雄 18万+

Java基于sqlite-jdbc和HikariCP包实现Java连接SQLite数据库源码

添加依赖 // https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc compile group: 'org.xerial', name: 'sqlite-jdbc', version: '3.32.3.2' // https://mvnrepository.com/artifact/com.zaxxer/HikariCP compile group: 'com.zaxxer', name: 'HikariCP',

醉野丶的博客 2073

SpringBoot项目启动时HikariCP连接池不立即创建?3种解决方案实测对比

本文深入解析SpringBoot项目中HikariCP连接池启动时延迟创建的问题,并提供三种实测有效的解决方案。通过对比ApplicationRunner强制初始化、手动配置HikariDataSource以及结合Spring Boot配置与初始化回调的方法,帮助开发者根据项目需求选择最佳方案,确保数据库连接的可靠性和应用性能。

Black的专栏 639

SpringBoot 数据源的自动配置HikariDataSource以及使用Druid数据源

SpringBoot分析数据源的自动配置以及配置和使用Druid数据源

m0_62946761的博客 1万+

JSSIP实战:5分钟搞定WebRTC电话功能(附完整代码示例)

本文通过JSSIP库实战演示如何在Web应用中快速集成WebRTC电话功能。文章提供了从环境准备、SIP服务器连接到完整代码示例的详细步骤,涵盖用户注册、拨号接听、媒体流处理等核心环节,并针对常见问题给出排查方案,帮助开发者高效实现网页端实时语音通信。

u8v9w0x1y的博客 517

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

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

qq_43842093的博客 3074

别再折腾老教程了!树莓派4B/5最新系统(Raspberry Pi OS Bookworm)红外遥控配置,用gpio-ir驱动一次成功

本文详细介绍了树莓派4B/5在最新Raspberry Pi OS Bookworm系统下配置红外遥控的完整指南,摒弃过时的lirc-rpi驱动,采用现代gpio-ir驱动方案。从硬件连接到软件配置,提供10分钟快速上手指南,涵盖驱动加载、信号测试、按键映射及高级应用场景,帮助用户高效完成红外遥控配置。

weixin_42520909的博客 442

均匀直线阵的常规波束形成matlab

常规波束形成概述 波束形成是将基阵各阵元输出进行一定的处理,从而形成基阵空间指向性的技术。一个波束形成器可以对空间某方位的信号有响应,而抑制其他方位的信号,所以又被称为空域滤波。一般分为常规波束形成(CBF)和自适应波束形成(ABF)。 常规波束形成较为基础,一般又可以根据实现的途径不同,分为时延波束形成和频移波束形成。 时延波束形成 在各阵元间添加时延使波束控制于不同方位的方法成为时延波束形成。设定一个目标方向,当信号来源方向在该目标方向时,响应最大;信号来源于其他方向时,响应较小。将这种响应大小

Xujing1143的博客 2万+

【解读HikariCP 1——HikariDataSource 设计细节】

《HikariDataSource初始化策略与性能优化解析》 本文深入剖析了HikariCP核心类HikariDataSource的设计实现,重点解读了其两种初始化策略。类结构上,HikariDataSource通过继承HikariConfig和实现标准接口,既保证了兼容性又减少了冗余。其提供了懒加载和预加载两种构造函数:默认懒加载模式采用双重检查锁定实现线程安全延迟初始化,适合快速启动场景;带配置参数的预加载模式则立即初始化连接池,通过fastPathPool优化高频连接获取路径,实现"空间换时

2401_83141884的博客 1028

Python + OpenCV 计算视频中运动最慢小球的坐标验证码

本文提出一种基于Python和OpenCV的视频分析方法,用于检测多个运动小球中最慢运动目标的坐标。方法主要包括:1) 通过背景差分和形态学处理提取运动前景;2) 基于轮廓面积和圆形度筛选候选小球;3) 利用图像矩计算小球质心坐标;4) 通过近邻关联构建运动轨迹;5) 根据轨迹平均速度确定最慢目标。该方法能有效处理包含线条干扰和静态大圆干扰的背景,稳定输出最慢小球的中心坐标。实验结果表明,该方法能准确识别运动最慢的小球并定位其位置。

码王吴彦祖的博客 112

wend看源码-连接池-HikariCP

本文总结了作者在学习HikariCP 源码时的一些总结和经验。

wend的博客 1199

[Dify] 法律文档解析助手怎么做才敢用?先把条款提取、依据核对和人工复核分开

这篇文章围绕用 Dify 搭建法律文档解析助手时最容易被忽略的可靠性问题展开:文档能上传、模型能总结,并不等于结果就能直接用于法务判断。文章会从文档抽取、条款定位、召回片段核对、结构化输出和人工复核几个角度梳理设计思路,适合正在用 Dify 处理合同、制度、招投标文件或企业知识库问答的读者阅读。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 9379

MySQL数据库面试题(2022版)

序列号 内容 链接 1 Java基础知识面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124023797 2 Java集合容器面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124043363 3 Java异常面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124....

拉格朗日的学习笔记 1万+

基于HiKariCP组件,分析连接池原理

HiKariCP作为SpringBoot2框架的默认连接池,号称是跑的最快的连接池,数据库连接池与之前两篇提到的线程池和对象池,从设计的原理上都是基于池化思想,只是在实现方式上有各自的特点;

【积累】,是一个长期持续的过程。 2907

XCP详解「3.1·ASAP2新建A2L文件」

后面是ASAP2新建A2L的操作步骤,如果是APE中新建的A2L就无需以下操作,APE只需要导入现成的A2L即可。退出点击保存时会提示保存A2L文件,是因为前面导出的是1.70版本,工程最低1.71,可以另外起个名字即可。导入elf文件,elf路径建议直接索引编译生成的Debug下的,防止编译后忘记更新。导出V1.70格式A2L文件,APE17支持V1.70。通过ASAP2生成需要A2L文件更常用些。同一个信号可以创建不同属性量。ASAP2中新建A2L文件。设置标定信号数量最大值。XCP详解「总目录」

光明磊学习&积累的地方 3059

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

我们上面说了,它是保证线程安全的。我们知道带Atomic前缀的一些类型,都是原子操作,它是线程安全的,在高并发情况下,能保证isShutdown的值在各个线程中是一致的,类似的还有AtomicInteger,AtomicLong等等,那么AtomicBoolean就是一个线程安全的布尔类型,这样就可以保证关闭连接池的时候,其他线程可以及时的感知到。因为锁这个东西,很耗性能,如果只有一个拿到锁之后的检查的话,相当于所有线程要排队检查是不是连接池已经创建了,相当于只能排队获取连接,这是不行的,我们要高性能!

wr_java的博客 941

Codex 实战 Skills:自动采集一天之内的 Git 提交,一键排版成精美工作日报并发送邮件

特性手动撰写脚本辅助(仅聚合)AI 增强自动化(本文方案)时间成本高(30-60分钟/天)中(5-10分钟/天)低(<1分钟/天)内容质量依赖个人总结能力原始数据堆砌,缺乏提炼专业、结构化、有业务视角信息完整性易遗漏完整,但难以阅读完整,且经过分类筛选维护成本无低中(需维护 Skill 配置)可扩展性低中高(可轻松添加周报、月报)适用场景所有开发者初级开发者追求效率的高级开发者本文详细介绍了一种基于 Codex Agent Skills 的自动日报生成方案。

yueyeguzhuo的专栏 102

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HikariCP是什么?为啥这么火?SpringBoot为啥选它?

本文测试使用 JNDI 获取HikariDataSource对象,选择使用tomcat 9.0.21作容器。如果之前没有接触过 JNDI ,并不会影响下面例子的理解,其实可以理解为像 spring 的 bean 配置和获取。

2401_88972089的博客 1240

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

HikariCP源码阅读(一)基础概念及核心配置

福利福利 福利 免费领取Java架构技能地图 注意了是免费送 、 免费领取 要的+V 领取 前言 HikariCP是SpringBoot2默认的数据库连接池,号称最快的连接池。 图片来源:github.com/brettwooldr… 一、基础概念 DataSource DataSource继承了Wrapper和CommonDataSource接口。 Wrapper:当前DataSource如果是代理实现,提供获取目标实例的能力。unwrap获取目标实例...

weixin_48673251的博客 402

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

四、HikariCP 源码分析之初始化分析一

此处的代码有点意思,System.getProperty是一个获取系统属性的方法,从字面看,它要获取一个叫做hikaricp.configurationFile的属性值,然后加载它。其实,这个是一个 Properties 配置文件的路径,它这是要从这个路径加载配置文件对吧。至于loadProperties如何加载配置文件并 set 到对应的配置中,这个没有什么特殊的设计,在这里不展开了,后面给大家分析下HikariConfig的几种初始化方式,大家也可以看下我的代码注释,非常详细。,是验证配置的参数。

wr_java的博客 410

HikariCP默认配置

本文根据2.7.9-SNAPSHOT版本的源码及相关资料做了梳理,主要参数是在com.zaxxer.hikari.HikariConfig中初始化的,部分参数是在com.zaxxer.hikari.pool.PoolBase中初始化的。 Springboot 2.0的autoconfig是采用BeanUtils的反射来初始化HikariDataSource,走的是默认构造器,因此校验就依赖set方...

码农书生 5604

HikariCP连接池使用和源码分析

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

shangjg3的博客 1051

hikaricp druid比较_Java 数据持久化系列之 HikariCP (一)

在上一篇《Java 数据持久化系列之池化技术》中,我们了解了池化技术,并使用 Apache-common-Pool2 实现了一个简单连接池,实验对比了它和 HikariCP、Druid 等数据库连接池的性能数据。在性能方面,HikariCP遥遥领先,而且它还是 Spring Boot 2.0 默认的数据库连接池。下面我们就来了解一下这款明星级开源数据库连接池的实现。本文的主要内容包括:Hikari...

weixin_39682301的博客 321
上一篇: 【HikariCP】【HikariConfig】源码学习
下一篇: 【HikariCP】【ConcurrentBag】源码学习
ColdFireMan
博客等级 码龄10年 27粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值