【问题标题】:Spring Boot Startup Slow After UpgradeSpring Boot 升级后启动慢
【发布时间】:2020-09-15 02:51:43
【问题描述】:

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

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

需要注意的是,在 localhost 上运行时,使用 2.1.3 和 2.3.0,应用程序启动是相同的,大约 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,我仍然希望得到答案。

【问题讨论】:

  • 我有一个简单的spring boot应用并更新到2.3.0版本,启动应用的时间几乎没有变化。可以打开调试日志看看哪个动作慢吗?
  • 这可能与自动配置有关。这可以解释惰性初始化没有影响以及为什么简单的应用程序不会检测到它。我们可以尝试的一件事是禁用@EnableAutoConfiguration(这可能相对昂贵,因为它会遍历所有工厂并试图找出应该导入的内容)并导入使用的特定配置。见stackoverflow.com/questions/33134030/…
  • 我在服务器上的 docker 中运行 2.3.0 时遇到了同样的问题。启动很慢,应用程序没有通过就绪探测检查,当降级到 2.2.7 时没问题。
  • 嗨科迪,你找到答案了吗?我仍然被这个问题困扰
  • @JoséMi,我从来没有找到 2.3.0 的实际答案或解决方案。但是,我只是简单地降级到了 2.2.5,这似乎是我当时所能达到的最高水平,而没有引起任何性能缓慢的问题。

标签: java spring hibernate spring-boot


【解决方案1】:

我在尝试从 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】:

    我的一部分工作是修补多个 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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-14
        • 2011-01-06
        • 2016-12-08
        • 2015-10-25
        • 2018-10-31
        • 2022-01-09
        • 2016-12-16
        • 2023-03-10
        相关资源
        最近更新 更多