七、HikariConfig 初始化分析

Spring Boot 中使用 Hikari,给我整不会了 2 初始化如果不是看官网,我不曾知道原来有这么多的初始化方式,我要一一的列举出来,扩展大家的思路。HikariConfig config = new HikariConfig();config.setJdbcUrl(“jdbc:mysql://localhost:3306/simpsons”);config.setUsername(“bart”);config.setPassword(“51mp50n”);config.addDataSourceProperty(“cachePrepStmts”, “tru 阅读详情

HikariConfig有 3 个构造方法,这三个构造方法其实都差不多,无我们逐个看一下:

无参构造

第一个无参的构造,代码如下:

public HikariConfig() {
      dataSourceProperties = new Properties();
      healthCheckProperties = new Properties();
      //①
      minIdle = -1;
      maxPoolSize = -1;
      maxLifetime = MAX_LIFETIME;
      connectionTimeout = CONNECTION_TIMEOUT;
      validationTimeout = VALIDATION_TIMEOUT;
      idleTimeout = IDLE_TIMEOUT;

      isAutoCommit = true;
      isInitializationFailFast = true;
      //②
      String systemProp = System.getProperty("hikaricp.configurationFile");
      if (systemProp != null) {
         loadProperties(systemProp);
      }
   }

①初始化默认值

初始化默认值这部分,这些参数我们在《HikariConfig 的配置解析》一文中都解析过这些参数,略过不提。

②获取配置文件地址

在这里首先尝试获取 key 是hikaricp.configurationFile的配置文件地址,如果用户配置了,就会加载。我们可以在启动应用的时候使用-D指定。

我们详细看下loadProperties方法:

   protected void loadProperties(String propertyFileName) {
      //①将propertyFileName当作一个路径, 直接加载文件
      final File propFile = new File(propertyFileName);
      //②判断propFile是一个文件, 就直接读取; 不是文件, 就继续查找, 加载不到, 直接报错
      try (final InputStream is = propFile.isFile() ? new FileInputStream(propFile) : this.getClass().getResourceAsStream(propertyFileName)) {
         if (is != null) {
            Properties props = new Properties();
            props.load(is);
            //③
            PropertyElf.setTargetFromProperties(this, props);
         } else {
            throw new IllegalArgumentException("Cannot find property file: " + propertyFileName);
         }
      } catch (IOException io) {
         throw new RuntimeException("Failed to read property file", io);
      }
   }

①加载文件

尝试将 propertyFileName 当作一个路径, 直接加载文件

②查找文件

在此判断 propFile 是不是一个文件, 是文件就直接读取; 不是文件, 就继续查找。如果最后还是 加载不到, 直接直接报错。

③获取属性

将 Properties 文件中的配置,取出来 set 到HikariConfig中。

配置赋值

我们看下实现:

public static void setTargetFromProperties(final Object target, final Properties properties) {
      if (target == null || properties == null) {
         return;
      }
      //①获取HikariConfig中的所有方法
      List<Method> methods = Arrays.asList(target.getClass().getMethods());
      //获取properties配置文件的所有配置项名称的集合, 例如dataSource.username = tom , 此处拿到的是dataSource.username这种等号左边的所有配置项
      Enumeration<?> propertyNames = properties.propertyNames();
      //遍历所有的配置项, 复制到HikariConfig中
      while (propertyNames.hasMoreElements()) {
         Object key = propertyNames.nextElement();
         String propName = key.toString();
         //获取配置项对应的值
         Object propValue = properties.getProperty(propName);
         if (propValue == null) {
            propValue = properties.get(key);
         }
         //②如果不是HikariConfig的配置, 是dataSource的配置, 也就是数据库相关的配置, 就添加到DataSourceProperty中
         // 因为每个数据库的配置可能不一样, 所有没有 setter 方法
         if (target instanceof HikariConfig && propName.startsWith("dataSource.")) {
            ((HikariConfig) target).addDataSourceProperty(propName.substring("dataSource.".length()), propValue);
         } else {
            //③如果不是 dataSource配置, 那就调用 setter 方法, 给HikariConfig赋值
            setProperty(target, propName, propValue, methods);
         }
      }
   }

在①处,通过反射获取到HikariConfig的所有方法,然后获取 properties 文件中所以的 key 值,遍历 properties 文件中的 所有 key,将配置项一项一项的设置到HikariConfig中。

注释非常详细,但是要提醒大家的是,并不是所有的配置,HikariCP 都有对应的属性,有一些数据库独有的配置项,我们通常是使用dataSource.XXX来配置的,所以如果在 properties 文件中有以dataSource.开头的配置项,那么就是 dataSource 的配置,要放到

DataSourceProperty 中,这些配置没有对应的 setter。③处的setProperty方法,就是一个比较普通的反射方式赋值的实现,大家看一下就可以了。

配置hikari数据库连接池时多数据源不生效 上述配置:hikari 与dynamic 对齐,处于同级。都位于spring.datasource下。如果是单数据源,这么配置生效,没问题,but 多数据源不生效。加载上述配置,此时发现默认配置生效。 阅读详情

相关推荐

好用!一键生成数据库文档,这个开源的文档生成工具值得了解

好用!一键生成数据库文档,这个开源的文档生成工具值得了解 Gitee项目地址,可以直接去开源项目查看(推荐) https://gitee.com/leshalv/screw 简介 在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有、要么有、但都是手写、后期运维开发,需要手动进行维护到文档中,很是繁琐、如果忘记一次维护、就会给以后工作造成很多困扰、无形中制造了很多坑留给自己和后人。 于是萌生了要自己写一个插件工具的想法,但由于自己前期在程序设

bishe_teacher的博客 718

HikariConfig配置详解

SpringBoot 2.0 开始推 HikariCP ,将默认的数据库连接池从 tomcat jdbc pool 改为了 hikari , HikariCP 在性能和并发方面确实表现不俗(号称最快的连接池)。 如果你使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa ,会自动添加对 HikariCP 的依赖,也就是说此时使用 H...

wsyyyyy的博客 1万+

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

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

weixin_33896726的博客 353

六、HikariConfig 配置解析

所谓的运行期可以修改的属性,就是可以使用 JMX 直接修改,我们再《HikariCP 源码分析之获取连接流程二》中提到了作者推荐的用法,大家可以看一下。我们今天分析下 HikariCP 中的配置,几乎所有的配置都在HikariConfig中,是HikariConfig的成员变量。其实比较重要的是运行时可以修改的那几个配置,只要搞明白了他们的含义,大家就可以按照自己的情况修改。HikariConfig的配置可以分为两部分:可以在运行期修改的,不可以在运行期修改的。

wr_java的博客 1873

深入解析HikariCP初始化:从配置到高性能连接池的构建

数据库连接池是现代Java后端应用的核心基础设施,它通过管理数据库连接的创建、分配和回收,显著提升了应用性能和资源利用率。其工作原理基于池化技术,预先建立一定数量的连接并缓存起来,当应用需要时快速分配,使用完毕后归还而非关闭,从而避免了频繁建立和销毁连接的开销。这项技术的核心价值在于降低数据库访问延迟、减少系统资源消耗,并能有效应对高并发场景。在实际应用中,连接池被广泛用于Web服务、微服务架构以及任何需要频繁进行数据库操作的系统。本文聚焦于Spring Boot默认集成的HikariCP,特别是其初始化过

Hi, Sun 452

深入解析HikariCP连接池:架构设计与初始化调优

数据库连接是应用与数据库交互的基础通道,其建立涉及网络握手、身份验证等开销。连接池技术通过复用预创建的连接,将连接创建销毁的开销均摊,从而显著提升高并发场景下的性能与资源利用率。在Java生态中,HikariCP以其极致的轻量、快速和稳定著称,成为Spring Boot等框架的默认选择。其核心架构围绕HikariPool、ConcurrentBag等组件构建,通过精妙的初始化过程完成连接预热、健康检查与泄漏检测等机制的武装。理解其初始化流程与核心配置,对于优化数据库访问性能、保障应用稳定性至关重要,尤其在微

weixin_34267123的博客 445

hikariconfig mysql_HikariConfig配置解析

欢迎访问我的博客,同步更新: 枫山别院源代码版本2.4.5-SNAPSHOT使用HikariConfig初始化 HikariCP在《HikariCP源码分析之初始化分析一》中,我们解析了 HikariCP 的两种初始化方式,其中提到了使用HikariConfig的方式:HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:...

weixin_33901995的博客 2428

别再瞎猜了!Fluent瞬态计算时间步长到底设多少?一个公式+实战案例搞定

本文详细解析了Fluent瞬态计算中时间步长的设置方法,通过黄金公式和实战案例,帮助工程师准确确定时间步长,避免计算发散和资源浪费。文章还介绍了动态调整策略和典型工程场景的参数优化,提升仿真效率和精度。

weixin_42638178的博客 425

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

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

wr_java的博客 410

数据资产目录(SailCatalog)和数据地图(SailMap)

笔者接下来准备开发大数据平台(XSailboat)中的数据资产目录(SailCatalog)和数据地图(SailMap)相关的功能,本文用以记录笔者关于此部分功能的概念梳理和主体功能设计。

OkGogooXSailboat的博客 2326

VisualStudio2022启动报错

把Users\...\AppData\Local\Microsoft\VisualStudio\11.0\ComponentModelCache中的Microsoft.VisualStudio.Default.cache这个文件移除,再重启vs,各项功能都能正常使用了。第一次使用方法1有效果,不知道什么原因后面又报错再删除缓存文件无效了,最后使用方法2启动VS成功。vs2022启动时,报错弹框,在ActivityLog查看具体报错信息,报错原因未知。网上搜索到两种解决方法。方法1:删除缓存文件。

面朝大海,春暖花开 3935

HikariCP 配置与初始化完全指南:零开销 JDBC 连接池的参数体系、源码原理与实战实践

HikariCP 是一个号称"零开销"(zero-overhead)的生产级 JDBC 连接池,以轻量(约 165KB)、高速与极简设计著称。本文以本仓库 [README.md](https://link.gitcode.com/i/ccb8994b86eb8f8619d02b50473c92c2) 为骨架,系统讲解 HikariCP 的依赖引入、JMH 基准方法论、全部 30+ 配置参数的语义与

gitblog_00233的博客 412

CPU也能跑大模型?手把手教你用vLLM离线部署Qwen2.5-7B-Instruct(附性能优化技巧)

本文详细介绍了如何在CPU服务器上高效部署Qwen2.5-7B-Instruct模型,通过vLLM框架和一系列优化技巧实现离线推理。内容包括环境配置、模型加载优化、性能调优及生产环境部署方案,帮助开发者在资源有限的情况下也能运行大语言模型。

weixin_28691741的博客 489

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

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

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

SAP公司间STO业务解析(包含主数据解析、后台配置解析、前台业务演示)

SAP公司间STO业务解析

ww114784的博客 1016

Android Input——输入系统介绍(一)

Input 系统对于提供流畅、灵敏和一致的用户交互体验至关重要,它需要在不同的设备、场景和应用中保证输入事件的正确性、及时性和安全性。Android 输入系统是一个复杂但高效的设计,旨在处理来自各种输入设备(如触摸屏、键盘等)的用户交互,并将这些交互转换为应用程序可以理解和响应的形式。EventHub:输入系统的最底层,直接与硬件通信,监听和读取输入设备的原始事件。:从 EventHub 获取原始输入事件,对其进行解析,转化为更高层次的事件,以便上层应用或服务能够理解。

小旭的专栏 1708

【追光者系列】HikariCP默认配置

点击上方“芋道源码”,选择“置顶公众号”技术文章第一时间送达!源码精品专栏 中文详细注释的开源项目Java 并发源码合集RocketMQ 源码合集Sharding-JDB...

芋道源码 2171

VS2019编译使用log4cplus 1.2.0

logger.properties 文件。第三步,创建项目来测试,配置库。第二步,使用VS2019编译。

h a 6 6 6 c k 为 你解决复杂难题! 526

Seata环境下HikariCP驱动加载失败排查与修复

连接池是数据库应用的核心组件,而驱动类的加载是连接池初始化的第一步。HikariCP作为高性能连接池,通过Class.forName加载驱动类,一旦失败便会导致应用启动时报错。类加载机制与线程上下文类加载器环境差异,常常成为隐藏的“刺客”。在引入Seata做分布式事务时,数据源被DataSourceProxy代理,初始化时机被提前,原本潜伏的驱动加载问题集中暴露。本文从Seata与HikariCP集成场景出发,梳理驱动类加载失败的根本原因,并给出显式配置驱动类名、优化数据源构造、手动预加载驱动等实用修复方案

weixin_30846347的博客 299

2021-09-29 每天几个LCEDA小知识——如何交叉选择并阵列放置元器件

立创EDA专业版之交叉选择并阵列放置元器件????交叉选择????阵列放置 ????交叉选择 在原理图界面,先框选需要交叉选择的元器件对象,右键,选择交叉选择(如果熟练之后,直接选择元器件,快捷键Shift+X)。 完成上述操作之后,可以看到自动跳转到PCB绘图界面,并自动选定PCB中相关的元器件,接下来不要取消选择的状态,在相关元器件被选中的情况下,即可开展阵列放置,将这些元器件都放在一个区域,方便PCB画线前的布局工作。 ????阵列放置 在布局菜单栏中,选择分布,选择阵列分布, 在弹出的对话框

l64481000的博客 1463

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring Boot接口冷热请求性能差异分析与优化

在Java应用开发中,ORM框架的懒加载机制和数据库连接池管理是影响性能的关键因素。以MyBatis和Hibernate为例,其默认配置可能导致冷热请求响应时间差异显著。通过Arthas工具进行方法级追踪可以发现,冷请求延迟主要源于SQL预处理语句重新编译和连接池重建。优化方案包括调整HikariCP连接池参数保持最小连接数、集成Redis作为二级缓存,以及实现智能预加载策略。这些技术手段可有效降低冷启动延迟达80%,提升高频查询接口的吞吐量。对于需要稳定响应时间的用户行为分析等系统,建议结合Spring

weixin_33778544的博客 1137

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SpringBoot+Vue旅游数据分析平台架构与实践

大数据分析平台是现代企业级应用的核心组件,其技术架构通常采用前后端分离模式。SpringBoot作为Java生态的主流框架,通过自动配置简化了后端服务开发;Vue.js则以其响应式特性成为前端开发的优选方案。在数据处理层面,Hive作为Hadoop生态的数据仓库工具,能够高效处理海量结构化数据。这种技术组合特别适合旅游行业数据分析场景,可实现从数据采集、清洗到可视化展示的全流程处理。通过集成ABO管理系统和RBAC权限模型,平台还能满足企业级安全需求。项目采用MySQL优化策略和Hive查询优化技术,确保系

weixin_33672109的博客 482

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

MySQL连接数暴增问题分析与解决方案

数据库连接池是管理数据库连接的重要组件,其核心原理是通过复用连接减少创建和销毁的开销。在MySQL中,当并发连接数超过max_connections限制时,会触发'Too many connections'错误,这通常由连接泄漏或突发流量引起。合理配置连接池参数(如HikariCP的maximumPoolSize)和设置超时机制能有效预防此类问题。对于Java应用,结合ORM框架如MyBatis的正确配置尤为重要。通过实时监控Threads_connected指标和定期检查Sleep连接,可以快速定位连接泄

weixin_30887919的博客 294

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

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

油墨香^-^的博客 1128
上一篇: 六、HikariConfig 配置解析
下一篇: 八、HikariCP 源码分析之 ConcurrentBag 一
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值