springboot项目启动慢的问题排查方式
作者:JohnJary 发布时间:2023-06-19 18:58:40
springboot项目启动慢的问题排查
springboot项目,随着时间的推移,启动耗时逐步增加,从几分钟慢慢的达到30多分钟,有点恐怖!
项目中用到技术:hibernate、redis、kafka、线程池等,启动慢的环境使用的是mysql数据库!
1.最开始查看的启动日志,是在输出:
org.hibernate.id.UUIDHexGenerator : HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 4122 compliant UUID values; consider using org.hibernate.id.UUIDGenerator instead
后停滞,等相当长时间后继续输出:
o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'taskExecutor'
怀疑是创建kafka、线程池等导致耗时,通过去掉相关对象创建,耗时仍无改观!
2. 启动项目,打印日志级别改为debug,查看更详细信息
发现:大量的alter table 增加外键!奇怪,不是第一次启动项目,mysql库中的表早已创建好,为什么每次都要重复alter?
查看mysql相关表发现无外键,表引擎为MyISAM!此引擎不支持外键!
在使用hibernate自动创建表时,mysql中建表使用的MyISAM引擎,查看配置:
dialect
:应使用org.hibernate.dialect.MySQL5InnoDBDialect
这就解释了:为什么orcle环境下没有此问题,而mysql就有,其随着时间的推移,表中数据逐渐增加,在启动时alter table耗时严重!
如何优化SpringBoot的项目的启动速度
日常开发SpringBoot项目启动类都用@SpringBootApplication
实际上它是下面三个注解的组合
@EnableAutoConfiguration
: enable Spring Boot's auto-configuration mechanism@ComponentScan
: enable@Component
scan on the package where the application is located (see the best practices)@Configuration
: allow to register extra beans in the context or import additional configuration classes
启动慢往往跟@ComponentScan和@EnableAutoConfiguration加载的内容太多有关,一种方法是不用这两个注解,通过@import注解精确指定要加载扫描的类,但要加载的类多时又很麻烦,
可以用@SpringBootApplication注解下面的属性
exclude
: Exclude the list of classes from the auto configuration.excludeNames
: Exclude the list of fully qualified class names from the auto configuration. This parameter added since spring boot 1.3.0.scanBasePackageClasses
: Provide the list of classes that has to be applied for the @ComponentScan.scanBasePackages
Provide the list of packages that has to be applied for the @ComponentScan. This parameter added since spring boot 1.3.0.
另外,如果SpringBoot项目启动很慢,可能意味着你要重新拆分微服务。
来源:https://blog.csdn.net/Jerry_John/article/details/106354154
猜你喜欢
- 因为mybatis好使,所以几乎需要操作数据库的时候,我都会使用mybatis,而且在一个正式的项目中,同时存在BS和CS的程序,都使用的M
- 在使用springMVC框架构建web应用,客户端常会请求字符串、整型、json等格式的数据,通常使用@ResponseBody注解使 co
- 前言当系统的并发比较高的时候,日志的处理输出也是一种性能的开销负担,所以,选择一个中间件来处理消费日志必不可少!下面是spring boot
- 开发环境win10Android Studio效果用于多级菜单展示,或选择。如 每个省,市,县;如 树木的病虫害;关键代码 @overrid
- 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,
- 背景后台系统需要接入 企业微信登入,满足企业员工快速登入系统流程图简单代码说明自定义一套 springsecurity 认证逻辑主要就是 根
- 一、写在前面 数据结构中的队列应该是比较熟悉的
- 本文主要介绍我为桌面和 Web 设计的一个超级秘密 Flutter 项目使用了画布和可拖动节点界面。本教程将展示我如何使用堆栈来使用小部件完
- yaml语法注解配置文件两种形式application.properties和.yaml第一种语法 key=value第二种key:空格va
- 本文实例为大家分享了flutter实现appbar下选项卡切换的具体代码,供大家参考,具体内容如下TabBar 、Tab、TabBarVie
- 目录简介官方示例错误示例解决方法一:Scaffold的子组件通过Builder构建解决方法二:使用GlobalKey存储ScaffoldSt
- 本文实例讲述了C++语言实现线性表之链表实现方法。分享给大家供大家参考。具体分析如下:插入、删除结点的代码有点多,但这样提高了代码的可读性,
- 无论哪种界面框架输入文本框都是非常重要的控件, 但是发现flutter中的输入框TextField介绍的虽然多,但是各个属性怎么组合满足需要
- 自从SEOTcs系统11月份24日更新了一下SEO得分算法以来,一直困扰我的一个问题出现了,java的数据job任务,在执行过程中会经常报以
- 上一篇Flutter页面路由及404路由拦截实现介绍了使用路由来实现页面的跳转,从而简化页面之间的耦合,并可以实现路由拦截。在实际开发中,我
- [LeetCode] 9. Palindrome Number 验证回文数字Determine whether an integer is
- 你知道String、StringBuilder、Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗?别急,这篇文章
- 在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较
- 1 自定义类加载器自定义类加载器的代码很简单,只需要继承ClassLoader类,覆写findClass方法即可其默认实现是会抛出一个异常:
- 什么是队列结构一种线性结构,具有特殊的运算法则【只能在一端(队头)删除,在另一端(队尾)插入】。分类:顺序队列结构链式队列结构基本操作:入队