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.hqwc.cn/news/336313.html

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

相关文章

【idea】idea插件编写教程,博主原创idea插件 欢迎下载

前言&#xff1a;经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参&#xff0c; 例如日常开发中 我们使用Objects.equals去比较 status(入参)&#xff0c;statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() &#xff0c;再比…

亚马逊,速卖通,美客多卖家怎么才能安全及有效的积累产品的评论

测评补单对于亚马逊、速卖通等平台卖家来说&#xff0c;是一种重要的运营手段之一&#xff0c;通过测评补单快速增加产品的销量、评论数量&#xff0c;提升排名&#xff0c;从而打造爆款产品。 测评养号的好处包括&#xff1a; 1. 提升店铺信誉&#xff0c;制造爆款&#xff…

Armv8-R AArch32 architecture概念学习

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网文档为准。阅读该文章&#xff0c;可以先查看AArch64 Exception Model学习&…

深入了解网络流量清洗--使用免费的雷池社区版进行防护

​ 随着网络攻击日益复杂&#xff0c;企业面临的网络安全挑战也在不断增加。在这个背景下&#xff0c;网络流量清洗成为了确保企业网络安全的关键技术。本文将探讨雷池社区版如何通过网络流量清洗技术&#xff0c;帮助企业有效应对网络威胁。 ![] 网络流量清洗的重要性&#x…

线性代数_同济第七版

contents 前言第1章 行列式1.1 二阶与三阶行列式1.1.1 二元线性方程组与二阶行列所式1.1.2 三阶行列式 1.2 全排列和对换1.2.1 排列及其逆序数1.2.2 对换 1.3 n 阶行列式的定义1.4 行列式的性质1.5 行列式按行&#xff08;列&#xff09;展开1.5.1 引理1.5.2 定理1.5.3 推论 * …

【数据结构】——期末复习题题库(7)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

速学python·输入输出

和用户交互 程序与用户交互工程中 用户把信息传送给程序的过程是 输入 程序把结果展示给用户的过程是 输出 输入输出的最简单的方法是利用控制台 例如 和 都是控制台,进行输入和输出的作用 但是: 我们常见的交互界面,例如QQ,浏览器,Wegame等,都不需要输入命令,大大简化了操…

odoo17 | 视图操作按钮

前言 到目前为止&#xff0c;我们主要通过声明字段和视图来构建我们的模块。在上一章中&#xff0c;我们刚刚通过计算字段和onchanges引入了业务逻辑。在任何真实的业务场景中&#xff0c;我们都会希望将一些业务逻辑链接到操作按钮。在我们的房地产示例中&#xff0c;我们希望…

Linux下进程控制

文章目录 创建进程fork创建进程fork返回值写诗拷贝fork常规用法fork失败的原因 进程终止进程正常终止查看进程退出码_exit函数exit函数exit 和 _exit 的区别return退出 进程等待进程等待的方式wait方法(系统调用)waitpid方法(系统调用) WEXITSTATUS 和 WIFEXITED阻塞等待和非阻…

diffusers加速文生图速度;stable-diffusion、PixArt-α

参考: https://pytorch.org/blog/accelerating-generative-ai-3/ https://colab.research.google.com/drive/1jZ5UZXk7tcpTfVwnX33dDuefNMcnW9ME?usp=sharing#scrollTo=jueYhY5YMe22 大概GPU资源8G-16G;另外模型资源下载慢可以在国内镜像:https://aifasthub.com/ 1、加速…

电子实验室设备:从零开始配置实验室(二)

本文译自 Electronics Lab Equipment: Kitting out a Lab from Scratch 焊台 廉价焊台/烙铁和Weller之间的焊接体验质量存在巨大差异。我强烈推荐直接使用优质Weller烙铁。即使用过了广受欢迎的Hakko&#xff0c;我也可以确定Weller的传热速度和热控制非常出色&#xff0c;并且…

java继承Thread实现多线程

1、AdminController文件 package com.controller;import com.myThread.AdminThread; import org.springframework.web.bind.annotation.*;RestController CrossOrigin RequestMapping("/admin") public class AdminController{GetMapping("/{id}")public …