【沉淀之华】SpringBoot配置原生HikariCP数据源两次初始化过程剖析 服务器与本地完全一致却不同数据源结果定位

文章目录

    • 背景介绍
    • 场景复现
    • 溯源
    • 彩蛋

背景介绍

JDK版本:1.8
SpringBoot: 2.2.3.RELEASE 整合原生Hikari数据源连接池
IDEA:2023.1

再保证服务器和本地的启动参数、apollo配置、代码分支完全一致的前提下,经过验证得到如下结论

  1. 在确定原生Hikari数据源配置是否生效时,发现引入Prometheus监控在本地和服务器环境在初始化数据源连接池是不一致的,具体表现:
    只要是IDEA本地运行,在没有任何数据库操作的前提下监控数据:本地运行结果要么是正确的配置结果,要么配错了都是默认值10【以最大最小活跃连接数为例】

    只要是云服务器运行,在没有任何数据库操作的前提下监控数据: 服务器运行结果要么是正确的配置,要么配错了最大最小活跃连接数而导致默认值是-1

  2. SpringBoot配置Hikari初始化是懒加载的,只有在数据库操作时才初始化数据源【注意验证不要添加test-connect-query 会干扰实验结果】

怎么配置监控可以参考网上这位大佬:https://blog.csdn.net/qq_36120342/article/details/119740189【网上都有咱就不重复了】

于是本着知其然亦要知其所以然的原则开启本篇漫长排查分析之路…


场景复现

下面给出两个配置让大家感受下 这个差异过程

正确的配置

spring.datasource.hikari.allow-pool-suspension = true
spring.datasource.hikari.connection-timeout = 10000
spring.datasource.hikari.pool-name = My-Hikari
spring.datasource.hikari.idle-timeout = 60000
spring.datasource.hikari.maximum-pool-size = 300
spring.datasource.hikari.max-lifetime = 120000
spring.datasource.hikari.minimum-idle = 30spring.datasource.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://a.com:4000/payment?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
spring.datasource.username = xx
spring.datasource.password = sx

错误的配置
这个故意写错最大活跃连接数,为了凸显错误,所以只改一处

spring.datasource.hikari.max-pool-size = 300

本地和云服务器在正确的配置下 监控的数据如下:
在这里插入图片描述
这无可厚非,下面看看异常配置下本地和云服务器的差异

本地运行结果:

在这里插入图片描述
且本地有初始化日志
在这里插入图片描述

服务器运行结果
在这里插入图片描述
云服务器没有初始化日志


溯源

在这里插入图片描述

通过断点调试跟踪发现,本地能有初始化数据库连接池的日志,从堆栈看出是Springboot开启了对数据源jmx监控,也就是说开启了jmx,就会触发SpringBoot Actuator对数据源的健康检查,而健康检查其中会调用validate方法校验HikariConfig的配置合法性,对于非法的配置会设置默认值即10

这里是引用

那么问题来了,既然是SpringBoot行为,怎么会出现差异,原因如下:
SpringBoot 2.2.x版本之前是默认开启jmx的,但是 2.2.x 以后是禁用JMX的,本文也是用的2.2.3,也就是说更不应该出现健康检查啊,在考虑所有代码配置和云服务器一样的背景下,我开始怀疑IDEA环境问题,最终在启动配置上发现问题所在
IDEA 2023.1 【看你的机器配置】的配置是默认帮你开启了JMX如下图【截图时我已经勾选】,所以无论SpringBoot行为如何,一定能触发健康检查,这才是导致差异的根本所在。
在这里插入图片描述
当勾选后,云服务器环境运行结果和本地完全一致。
ok,剩下懒加载问题就很好验证了,执行一个Sql看看是不是在sql执行后出现初始化日志,而此时再去刷新监控:http://localhost:8088/actuator/prometheus,可以看到最初的默认值-1 变为默认值10

在这里插入图片描述
本质是因为先执行sql去建立连接时成功触发validate方法完成最终初始化,至此问题剖析完毕。


彩蛋

如果的你结论和我不一样,那么极有可能是IDEA版本低或者使用了自动开启JMX的SpringBoot版本

那么我们推论到SpringBoot整合Dynamic-Source是不是也是懒加载的?结论不是
只要引入了dynamic-source依赖,无论你是否配置正确,都会尝试去加载,而且有个巨坑的点你即便配错了,只提示警告,但是只要一执行数据库操作,就会报错,找不到主数据源错误

印证如下:
在这里插入图片描述
可以看出这是main线程下,也就是立即加载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/337039.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ITK库学习】使用itk库进行图像分割(四):水平集分割

目录 1、水平集2、itkFastMarchingImageFilter 快速步进分割3、itkShapeDetectionLevelSetImageFilter 快速步进分割 1、水平集 水平集是跟踪轮廓和表面运动的一种数字化方法。基于图像的亮度均值、梯度、边缘特征的微分计算,进行水平集分割。在itk中,所…

一台Linux服务jdk1.6 与 jdk1.8 并存,tomcat6+tomcat8 并存

Linux jdk1.6,1.8 tomcat6 tomcat8 并存 需求场景: 有一个项目 原来是 jdk1.6tomcat6 部署的,现在需要进行项目架构升级 项目需要适配jdk1.8 然后用 jdk.8 tomcat 8进行部署,然后下架 jdk1.6 的linux服务 现在有一台 jdk.8 tomcat 8的linu…

debug OpenBLAS library 和 应用示例

1. 构建openblas lib git clone gitgithub.com:OpenMathLib/OpenBLAS.git cd OpenBLAS/ 如果要安装在自定义文件夹中,可以修改 PREFIX 的定义: 将 PREFIX /opt/OpenBLAS 修改成 PREFIX ../local/ 然后构建: make -j make install 如果要…

抽烟识别摄像机

抽烟识别摄像机是一种利用计算机视觉和人工智能技术的设备,能够实时监测和识别吸烟行为。该摄像机通过分析人体姿态和动作,识别出可能的吸烟行为,并及时发出警告或报警。这种摄像机可以广泛应用于公共场所、办公场所、学校和医疗机构等地方&a…

仰望星空,也要鲜花与掌声

在各种武侠文化的渲染下,我从小萌生了一种奇怪的想法,就是弄任何事都要偷偷摸摸的钻研,最后惊艳所有人;因此无论是大学还是毕业工作中,很多事情都希望做到“完美”再同步给“外界”,如以下几个例子 学习Sp…

vue element plus Typography 排版

我们对字体进行统一规范,力求在各个操作系统下都有最佳展示效果。 字体# 字号# LevelFont SizeDemoSupplementary text12px Extra SmallBuild with ElementBody (small)13px SmallBuild with ElementBody14px BaseBuild with ElementSmall Title16px MediumBuild w…

恭喜Zhilong LI同学通过Oracle 19c OCP考试

Oracle 19c OCP两门科目考试成绩、证书展示: Oracle 19c OCP 1z0-082考试详情 Oracle 19c OCP 1z0-083考试详情

vue element plus 安装

环境支持# Element Plus 可以在支持 ES2018 和 ResizeObserver 的浏览器上运行。 如果您确实需要支持旧版本的浏览器,请自行添加 Babel 和相应的 Polyfill 。 由于 Vue 3 不再支持 IE11,Element Plus 也不再支持 IE 浏览器。 Edge ≥ 79Firefox ≥ 78C…

第87讲:XtraBackup备份工具的核心技术要点及全库备份、恢复案例

文章目录 1.XtraBackup备份工具的简介2.XBK备份工具的安装3.XBK备份工具的使用语法4.XBK备份前的准备5.使用XBK对全库进行备份5.1.XBK备份全库数据的语法格式5.2.使用XBK进行全库备份5.3.查看XBK备份的数据文件5.4.备份过程中生产的XBK文件 6.模拟故障案例并使用XBK恢复备份的数…

人工智能:未来智慧城市建设的“智慧大脑”与核心价值

目录 一、引言 二、人工智能在智慧城市中的应用实例 三、人工智能对智慧城市建设的核心价值 四、面临的挑战与未来展望 五、结语 六、附:智慧城市全套解决方案大合集 - 下载 一、引言 随着科技的飞速发展,智慧城市的概念逐渐深入人心。智慧城市利…

nginx+keepalived双主模式双主热备

目录 一、双主模式原理 1. nginxkeepalived主备模式缺点 2. 主备模式和双主模式的区别 二、配置文件 1. nginx01的keepalived.conf 2. nginx02的keepalived.conf 3. 检测nginx存活脚本文件nginx_check.sh 三、测试准备 1. 启动nginx01、nginx02 2. 启动keepalived 3. 查看网卡信…

【REST2SQL】07 GO 操作 Mysql 数据库

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】06 GO 跨包接口重构代码 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发&#xf…