springboot程序启动慢解决

记springboot程序启动慢解决。

今天将程序发给别人后,别人立马说你这个启动很慢。

查看程序启动耗时分布

<!--启动耗时监测-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

management:endpoints:web:exposure:include: startup

修改启动类:

@SpringBootApplication
@MapperScan("com.huishi.mapper")
public class LljkApplication {public static void main(String[] args) {
//        SpringApplication.run(LljkApplication.class, args);new SpringApplicationBuilder(LljkApplication.class).applicationStartup(new BufferingApplicationStartup(20480)).run(args);System.out.println("============启动成功");}}

然后发送POST请求到/actuator/startup接口就会返回程序启动的耗时分布,然后我发现是dataSource xxxDataMapper sqlSessionFactory这几个bean初始化时间太长了,有30几秒,这一看就知道是和数据库源有关。

由于是启动很慢,所以猜测是程序启动时在创建数据库连接池的时,需要创建指定数量的数据库连接慢导致的。

建立数据库连接流程

MySQL服务器收到来自客户端的tcp连接请求后,服务器会根据客户端IP到host_cache查询是否存在有效的解析记录,如果有直接创建成功。

没有或HOST_VALIDATED为NO,就会对IP进行DNS解析,首先通过IP解析出主机名,再将主机名进行解析出IP,将这两次IP进行比对,如果一样,则解析成功,并将HOST_VALIDATED设为YES。如果解析失败,判断失败的原因是永久的还是临时的,如果是永久的,则HOST的值依旧为NULL,且将HOST_VALIDATED的值设置为YES,后续连接不再进行解析,如果该原因是临时的,则HOST_VALIDATED依旧为NO,后续连接会再次进行DNS解析。

 查看host_cache表

mysql> select * from performance_schema.host_cache\G
*************************** 1. row ***************************IP: 192.168.31.47      #连接到服务器的客户端IP地址HOST: NULL               #客户端DNS解析出的主机名,null代表未知HOST_VALIDATED: NO                #是否执行了DNS解析,如果值为YES则主机列将用作与IP相对应的主机名,以便可以避免对DNS的其他调用;如果值为NO则每次连接尝试都会尝试DNS解析,直到最终以有效结果或永久错误完成解析SUM_CONNECT_ERRORS: 0                  #被视为“阻塞”的连接错误数,仅统计协议握手错误,并且仅统计HOST_VALIDATED=YES的主机COUNT_HOST_BLOCKED_ERRORS: 0                  #以下为各种连接方式失败的计数COUNT_NAMEINFO_TRANSIENT_ERRORS: 0COUNT_NAMEINFO_PERMANENT_ERRORS: 1COUNT_FORMAT_ERRORS: 0COUNT_ADDRINFO_TRANSIENT_ERRORS: 0COUNT_ADDRINFO_PERMANENT_ERRORS: 0COUNT_FCRDNS_ERRORS: 0COUNT_HOST_ACL_ERRORS: 0COUNT_NO_AUTH_PLUGIN_ERRORS: 0COUNT_AUTH_PLUGIN_ERRORS: 0COUNT_HANDSHAKE_ERRORS: 0COUNT_PROXY_USER_ERRORS: 0COUNT_PROXY_USER_ACL_ERRORS: 0COUNT_AUTHENTICATION_ERRORS: 17COUNT_SSL_ERRORS: 0COUNT_MAX_USER_CONNECTIONS_ERRORS: 0
COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS: 0COUNT_DEFAULT_DATABASE_ERRORS: 0COUNT_INIT_CONNECT_ERRORS: 0COUNT_LOCAL_ERRORS: 0COUNT_UNKNOWN_ERRORS: 0FIRST_SEEN: 2020-12-18 10:30:03 #客户端第一次尝试连接的时间戳LAST_SEEN: 2020-12-18 14:50:41 #客户端看到最新的连接尝试的时间戳FIRST_ERROR_SEEN: 2020-12-18 10:30:03 #第一次连接错误的时间戳LAST_ERROR_SEEN: 2020-12-18 14:46:37 #最近一次连接错误的时间戳
1 row in set (0.00 sec)

参数 host_cache_size与skip_name_resolve 的作用

host_cache_size:控制主机缓存的数量,设置为0时,禁用主机缓存,每次服务器连接时,服务器都会进行DNS查找,相比skip-host-cache来说,host_cache_size更加灵活,可以随时变更或禁用。

skip_name_resolve:检查客户端连接时是否进行DNS解析IP主机名,默认是关闭的,则MySQL服务器会在检查客户端连接时解析主机名。若开启,则跳过这个DNS解析的过程,就只用IP ;在这种情况下,授权表中的所有列值都必须是 IP地址。

有些时候DNS 解析延迟或者网络环境不稳定的情况下,可以设置这个配置从而跳过DNS解析的过程,加快数据库连接速度。

解决方式

因为我们程序在启动时,需要创建不止一条数据库连接,有时需要创建多个数据库连接放入数据库连接池,然而每条都进行DNS解析就导致速度很慢,可以直接跳过。

在mysql的配置文件my.ini中增加以下配置:

[mysqld]
skip-name-resolve

开启这个配置后,就不能基于主机进行授权了,一般IP是多变的,但是主机名是不变的,所以基于主机HOST授权只需授权一次。开启这个配置需要基于IP进行授权。

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

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

相关文章

Golang 交叉编译之一文详解

博客原文 文章目录 Golang 中的交叉编译不同操作系统间的编译Linux 下编译windowsmacos windows 下编译Linuxmacos macos 下编译Linuxwindows 不同架构下的编译amd64x86 参考 Golang 中的交叉编译 在 Golang 中&#xff0c;交叉编译指的是在同一台机器上生成针对不同操作系统或…

003-10-02【Spark官网思维笔记】香积寺旁老松树边马大爷家女儿大红用GPT学习Spark入门知识

003-10-02【Spark官网思维笔记】香积寺旁老松树边马大爷家女儿大红用GPT学习Spark入门知识. Spark 快速入门快速开始使用 Spark Shell 进行交互式分析&#xff1a;独立的应用程序其他 1, 使用 Spark Shell 进行交互式分析1.1 基本1.2 有关Dataset操作的更多信息1.3 缓存 2&…

【算法每日一练]-动态规划 (保姆级教程 篇16) #纸带 #围栏木桩 #四柱河内塔

目录 今日知识点&#xff1a; 计算最长子序列的方案个数&#xff0c;类似最短路径个数问题 四柱河内塔问题&#xff1a;dp[i]min{ (p[i-k]f[k])dp[i-k] } 纸带 围栏木桩 四柱河内塔 纸带 思路&#xff1a; 我们先设置dp[i]表示从i到n的方案数。 那么减法操作中&#xff…

邻接矩阵、可达性矩阵、完全关联矩阵、可达性矩阵的计算

邻接矩阵&#xff1a;很简单&#xff0c;就是两个点有关系就是1&#xff0c;没有关系就是0 可达性矩阵&#xff1a;非常简单&#xff0c;两点之间有路为1&#xff0c;没有路为0 可发行矩阵的计算&#xff1a;有n个元素&#xff0c;初始可达性矩阵为A&#xff0c;那么最终的矩阵…

EtherCAT驱动器回零与控制器回零:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(九)

XPCIE1032H功能简介 XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡&#xff0c;可选6-64轴运动控制&#xff0c;支持多路高速数字输入输出&#xff0c;可轻松实现多轴同步控制和高速数据传输。 XPCIE1032H集成了强大的运动控制功能&#xff0c;结合MotionRT7运动…

HelpLook VS Bloomfire:知识管理工具选哪个合适?

在快速发展的信息社会&#xff0c;知识管理变得越来越重要。无论是企业还是个人&#xff0c;都需要一种有效的工具来管理、搜集和分享知识&#xff0c;以提高效率和协作能力。面对市面上各种各样的知识管理工具&#xff0c;就是不知道怎么去挑合适的。HelpLook和Bloomfire是我今…

单调栈练习(四)— 统计全 1 子矩形

题目 同样的LeetCode原题&#xff1a;题目链接 给你一个 m x n 的二进制矩阵 mat &#xff0c;请你返回有多少个 子矩形 的元素全部都是 1 。 单调栈 解题思路整体和上一篇文章差不多&#xff0c;都是用到了压缩数组的技巧&#xff0c;通过压缩数组来构建一个数组矩阵、以每一…

记录仪可作为XCP从站进行数据转发

车辆数据采集系统通常包含多种数据采集设备、多路总线或传感器信号&#xff0c;为了集中监控和管理&#xff0c;需要将这些设备的实时数据传输到上位机。对此&#xff0c;我们将使用基于XCP&#xff08;Universal Measurement and Calibration Protocol&#xff09;协议的数据记…

HDFS相关API操作

文章目录 API文档环境配置API操作准备工作创建文件夹文件上传文件下载文件删除文件的更名和移动获取文件详细信息 API文档 HDFS API官方文档&#xff1a;https://hadoop.apache.org/docs/r3.3.1/api/index.html 环境配置 将Hadoop的Jar包解压到非中文路径&#xff08;例如D:…

在线图表编辑工具Draw.io本地部署并结合内网穿透实现远程协作办公

前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软件为收费&#xff0c;并且因为其功能强大&#xff0c;导致安装需要很多的系统内存&#xff0c;并且是不可跨平台使用。所以&#xff0c;今天给…

PHP开发日志 ━━ 不同方法判断某个数组中是否存在指定的键名,测试哪种方法效率高

我们可以用isset($arr[a]) 或者 array_key_exists(a, $arr) 来判断a键名是否存在与$arr数组。 那么这两种方式哪个运行速度快呢&#xff1f; 不多废话了&#xff0c;现在我们写一段代码来测试一下&#xff1a; $array [a > 1, b > 2, c > 3];$start microtime(tru…

如何让软文获取更多流量?

软文推广作为大中小企业常用的推广方式&#xff0c;能够提高品牌形象&#xff0c;打造企业知名度、促进产品转化方面有着非常不错的效果&#xff0c;而且成本较低&#xff0c;风险较小。但有许多企业不清楚软文营销到底怎么做才能获得更多流量&#xff0c;今天媒介盒子就来和大…

基于JAVA的社团管理系统的设计与实现

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 课题背景 互…

网络层详解

目录 前言 一、IP协议 1、IP协议报头 2、协议字段理解 &#xff08;1&#xff09;4位版本 &#xff08;2&#xff09;4位首部长度 &#xff08;3&#xff09;8位服务类型 &#xff08;4&#xff09;16位总长度 &#xff08;5&#xff09;标识、标志与片偏移 &#xf…

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

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

STM32 ADC采样调试笔记

最近在搞STM32L051系列一个小MCU&#xff0c;要用这个去采集两路ADC作为输入。期间也碰到过一些问题&#xff0c;顺便记录下。 ADC采集原理不说了&#xff0c;主要采集电压&#xff0c;用数字进行细分&#xff0c;这样就可以知道输入电压多少了&#xff0c;网上也有很多相关文…

220v免驱动led驱动芯片:SM2082EDS适用于LED 球泡灯,筒灯

220V免驱动LED驱动芯片是一种电源管理芯片&#xff0c;它可以在接入220V交流电后&#xff0c;将电压转换为适合LED灯珠工作的直流电压&#xff0c;从而点亮LED灯珠。这种驱动芯片通常具有较高的转换效率和稳定性&#xff0c;能够有效地降低能耗和延长LED灯珠的寿命。 SM2082EDS…

基于SpringBoot的教学管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

​软件测试面试:关键问题解析

在软件开发领域&#xff0c;测试是确保软件质量的重要环节。面试是评估软件测试人员技能和经验的关键时刻。在一个软件测试面试中&#xff0c;面试官通常会问一系列问题来评估面试者的知识、技能和解决问题的能力。本文将介绍一些常见的软件测试面试问题&#xff0c;并给出一些…

【2024最新版】接口自动化测试基础(基础篇)

接口自动化测试基础 目录 1、什么是接口自动化测试 2、接口自动化测试要素 3、常用的落地方案 什么是接口自动化测试 PART 01 1.1什么是接口自动化测试 接口自动化测试是一种通过编写脚本或使用工具来自动化执行应用程序接口来验证接口正确性的测试方法。接口自动化测试的…