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

news/2024/7/5 1:59:58 标签: spring boot, Hikari, 数据源, JMX

文章目录

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

背景介绍

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 = 30

spring.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.niftyadmin.cn/n/5323651.html

相关文章

【前后端的那些事】开源!快速上手富文本+富文本图片上传

文章目录 fullText富文本1. 后端接口1.1 定义常量1.2 定义返回实体类1.3 上传图片接口1.4 下载图片接口 2. 前端代码编写2.1 安装2.2 快速使用 3. 配置富文本图片上传地址3.1 配置图片上传配置 4. 全部代码展示 前言:最近写项目,发现了一些很有意思的功能…

Word2007导出PDF的正确做法

客户让做个一程序,从Excel读出数据,经过统计、计算生成PDF文档。我的做法是中间安装模板生成Word文档,然后在导出为PDF。 程序完成后需要测试,客户的环境是Win10Office2007。我用虚拟机搭建了环境,发现Word2007竟然无…

Linux - No space left on device

问题描述 No space left on device 原因分析 说明在服务器设备上的存储空间已经满了,不能再上传或者新建文件夹或者文件等。 解决方案 确认查看服务器系统的磁盘使用情况是否是真的已经没有剩余空间,复制下面命令在服务器上运行,然后发现如果…

python工具-udp-tcp-client-server-demo

python工具-udp-tcp-client-server-demo server tcp-server: python xxx.py -type tcp -ip “127.0.0.1” -port 1234udp-server: python xxx.py -type udp -ip “127.0.0.1” -port 1234 client python xxx.py -type udp -ip “127.0.0.1” -port 1111python xxx.py -type tc…

Java多线程并发篇----第十三篇

系列文章目录 文章目录 系列文章目录前言一、Semaphore 信号量二、Semaphore 与 ReentrantLock 区别三、可重入锁(递归锁)四、公平锁与非公平锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,…

2024最新外贸建站:SiteGround主机购买使用及自建外贸独立站教程

原文来源:https://guomuyu.com/building-website-siteground.html 在开始之前,让我们先了解一下什么是外贸独立站。外贸独立站简单来说就是一个拥有独立域名的网站,它不依赖于第三方平台(如阿里巴巴、亚马逊等)的网站…

【书生·浦语】大模型实战营——第五课笔记

教程文档:https://github.com/InternLM/tutorial/blob/main/lmdeploy/lmdeploy.md 视频链接:https://www.bilibili.com/video/BV1iW4y1A77P 大模型部署背景 关于模型部署 通常需要模型压缩和硬件加速 大模型的特点 1、显存、内存花销巨大 2、动态s…

【AI】Pytorch 系列:预训练模型使用

1. 模型下载 import re import os import glob import torch from torch.hub import download_url_to_file from torch.hub import urlparse import torchvision.models as modelsdef download_