升级后Spring Boot启动缓慢

时间:2020-05-27 22:10:36

标签: java spring hibernate spring-boot

我最近刚刚将我的一个团队的Spring Boot应用程序从2.1.3-RELEASE升级到现在的2.3.0-RELEASE,并将Hibernate版本从5.3.6.Final升级到5.4.15.Final。 >

一切都很好,但是现在,当应用程序在服务器上启动时,启动过程大约需要30秒钟,大约需要800-900秒(大约15分钟)才能启动。

需要注意的一点是,在2.1.3和2.3.0的localhost上运行时,应用程序启动是相同的,大约需要12-15秒。

仅在部署到服务器时才会遇到启动缓慢的问题。

我确信问题出在新版本的Spring Boot上,因为我切换到SpringBoot 2.1.3并将Hibernate保留为5.4.15,并且启动很快。

那么,在最近的SpringBoot发行版中是否有某些更改,我必须设置一个属性以禁用某些检查或其他功能?

我见过的大多数文章和帖子都说问题出在Hibernate上,并设置了此属性spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false,但我这样做了,但没有任何效果。

更新:

我尝试了属性spring.main.lazy-initialization=true,但它对启动性能没有影响。

更新2:

我从2.3.0降级到2.2.7,平均启动时间为170秒,而2.3.0的平均启动时间为800秒。大约3分钟的启动时间仍然很糟糕,但是相差12分钟,除了版本没有其他变化,我想知道它是否太雄心勃勃,无法安装最新版本的Spring Boot。

如果有人对为什么我们从2.1.3的30秒开始时间变为2.2.7的3分钟开始时间,仍然很好奇。

在2.1.x和2.2.x之间引入了重大变化吗?

最后更新

我尝试使用2.2.5版本,该版本从2.1.3开始没有降低启动性能。如果有的话,启动性能已经提高。因此,这使我相信2.2.6和更高版本的幕后情况已经发生了变化。

我将坚持使用2.2.5,但是如果有人尝试使用这些最新版本的Spring Boot,我仍然希望能找到答案。

3 个答案:

答案 0 :(得分:1)

如果您可以升级到 Spring Boot 2.4.x,则有一个名为 /startup 的新 Actuator 端点,它会告诉您每个初始化 bean 花费了多长时间,这应该会告诉您什么原因如此之慢:https://medium.com/techwasti/startup-actuator-endpoint-spring-boot-54a8dd0a1fdb

答案 1 :(得分:0)

我在尝试从Spring Boot 2.2.6升级到2.3.0时遇到了同样的问题。 在服务器或Docker容器中运行spring boot应用程序时,我观察到应用程序启动时间变慢,并且在win和mac上都看不到本地运行的问题。

出于好奇,我拿起spring-petclinic并尝试在docker上运行它。 那就是我得到的启动时间。

使用Spring Boot 2.3.0

2020-05-29 15:33:28.957  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 22.723 seconds (JVM running for 24.397)
2020-05-29 15:41:08.278  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 22.955 seconds (JVM running for 24.641)
2020-05-29 15:42:20.741  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 24.847 seconds (JVM running for 26.534)
2020-05-29 15:43:28.472  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 24.645 seconds (JVM running for 26.294)
2020-05-29 15:43:58.152  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 23.931 seconds (JVM running for 25.609)
2020-05-29 15:44:30.186  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 24.708 seconds (JVM running for 26.608)

使用Spring Boot 2.2.6

2020-05-29 15:40:25.829  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 19.062 seconds (JVM running for 20.474)
2020-05-29 15:41:35.797  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 18.18 seconds (JVM running for 19.582)
2020-05-29 15:48:36.693  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 18.648 seconds (JVM running for 20.067)
2020-05-29 15:49:00.379  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 18.548 seconds (JVM running for 19.978)
2020-05-29 15:49:23.282  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 18.808 seconds (JVM running for 20.218)
2020-05-29 15:49:47.100  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 19.862 seconds (JVM running for 21.285)
2020-05-29 15:50:08.247  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 16.599 seconds (JVM running for 17.916)

我想知道那方面发生了什么变化...

令人惊讶的是,Spring Boot 2.3.1看起来更好,几乎与2.2.x相同:

2020-06-19 21:16:18.935  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 18.886 seconds (JVM running for 20.552)
2020-06-19 21:16:43.461  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 18.637 seconds (JVM running for 20.091)
2020-06-19 21:17:07.226  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 18.526 seconds (JVM running for 20.007)
2020-06-19 21:17:30.172  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 19.694 seconds (JVM running for 21.209)
2020-06-19 21:17:57.662  INFO 1 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 20.348 seconds (JVM running for 21.85)

我建议尝试2.3.1。

答案 2 :(得分:0)

我工作的一部分是修补多个 Spring Boot 应用程序。我一般没有经历过较慢的启动,但是使用休眠搜索和弹簧启动数据的 1 个项目在延迟初始化方面存在严重问题,最终导致线程死锁。

https://github.com/spring-projects/spring-framework/issues/25111

要记住的另一件事是“新的”spring boot docker image builder :) https://spring.io/blog/2020/01/27/creating-docker-images-with-spring-boot-2-3-0-m1