Spring Boot 2.3与JPA:CommandLineRunner完成延迟

huangapple go评论98阅读模式
英文:

Spring Boot 2.3 with JPA: CommandLineRunner finish delayed

问题

以下是翻译好的内容:

我在使用Spring Boot 2.3.3中的CommandLineRunner,使用JPA,在完成后有1分钟的延迟(见下面的日志)。即使没有实体类存在,也没有JPA操作,这种情况仍然会发生。即使只有一个主要为空的主类的项目也可以复现这个问题。

这在2.2.7版本中没有发生,但在2.3.1中发生。它不仅在h2上发生,在其他数据库(derby、oracle)上也发生。如果我只使用spring-boot-starter-data-jdbc而不是spring-boot-starter-data-jpa,就不会有延迟。

有没有什么办法可以避免这个延迟?

日志:

  1. 2020-09-01 10:51:57.408 INFO 30314 --- [ main] testcase.SlowShutdown : Starting SlowShutdown on io with PID 30314
  2. 2020-09-01 10:51:57.410 INFO 30314 --- [ main] testcase.SlowShutdown : No active profile set, falling back to default profiles: default
  3. 2020-09-01 10:51:57.858 INFO 30314 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : DEFERRED模式下引导Spring Data JPA存储库。
  4. 2020-09-01 10:51:57.873 INFO 30314 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : 完成Spring Data存储库扫描,耗时10毫秒。找到0JPA存储库接口。
  5. 2020-09-01 10:51:58.095 INFO 30314 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : 正在初始化ExecutorService 'applicationTaskExecutor'
  6. 2020-09-01 10:51:58.100 INFO 30314 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 正在启动...
  7. 2020-09-01 10:51:58.171 INFO 30314 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 启动完成。
  8. 2020-09-01 10:51:58.216 INFO 30314 --- [ task-1] o.hibernate.jpa.internal.util.LogHelper : 处理PersistenceUnitInfo [name: default]
  9. 2020-09-01 10:51:58.243 INFO 30314 --- [ task-1] org.hibernate.Version : Hibernate ORM核心版本5.4.20.Final
  10. 2020-09-01 10:51:58.274 INFO 30314 --- [ main] DeferredRepositoryInitializationListener : 触发延迟初始化Spring Data存储库...
  11. 2020-09-01 10:51:58.274 INFO 30314 --- [ main] DeferredRepositoryInitializationListener : Spring Data存储库已初始化!
  12. 2020-09-01 10:51:58.282 INFO 30314 --- [ main] testcase.SlowShutdown : 1.118秒内启动了SlowShutdownJVM运行时间为1.579秒)
  13. 2020-09-01 10:51:58.283 INFO 30314 --- [ main] testcase.SlowShutdown : 启动
  14. 2020-09-01 10:51:58.315 INFO 30314 --- [ task-1] o.hibernate.annotations.common.Version : Hibernate Commons Annotations版本{5.1.0.Final}
  15. 2020-09-01 10:51:58.387 INFO 30314 --- [ task-1] org.hibernate.dialect.Dialect : 使用方言:org.hibernate.dialect.H2Dialect
  16. 2020-09-01 10:51:58.498 INFO 30314 --- [ task-1] o.h.e.t.j.p.i.JtaPlatformInitiator : 使用JtaPlatform实现:[org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
  17. 2020-09-01 10:51:58.502 INFO 30314 --- [ task-1] j.LocalContainerEntityManagerFactoryBean : 为持久性单元'default'初始化了JPA EntityManagerFactory
  18. 2020-09-01 10:52:58.512 INFO 30314 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : 为持久性单元'default'关闭了JPA EntityManagerFactory
  19. 2020-09-01 10:52:58.513 INFO 30314 --- [extShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : 作为SessionFactory关闭的一部分,开始延迟逐出模式数据
  20. 2020-09-01 10:52:58.519 INFO 30314 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : 正在关闭ExecutorService 'applicationTaskExecutor'
  21. 2020-09-01 10:52:58.521 INFO 30314 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 启动关闭...
  22. 2020-09-01 10:52:58.529 INFO 30314 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 关闭完成。

Pom:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-starter-parent</artifactId>
  7. <version>2.3.3.RELEASE</version>
  8. <relativePath/>
  9. </parent>
  10. <groupId>test</groupId>
  11. <artifactId>slowshutdown</artifactId>
  12. <version>0.0.1-SNAPSHOT</version>
  13. <name>slowshutdown</name>
  14. <description>slowshutdown</description>
  15. <properties>
  16. <java.version>11</java.version>
  17. </properties>
  18. <dependencies>
  19. <dependency>
  20. <
英文:

I have a CommandLineRunner on Spring Boot 2.3.3 using JPA which has a 1 minute delay after finishing (see log below). This happens even when there are no entity classes present and there is no JPA operation. It's reproducible with a project consisting of only a mainly empty main class.

This did not occur with version 2.2.7, but does on 2.3.1. It happens not only on h2 but also on other databases (derby, oracle). If I use only spring-boot-starter-data-jdbc instead of spring-boot-starter-data-jpa there is no delay.

Is there any way to avoid this delay?

  1. 2020-09-01 10:51:57.408 INFO 30314 --- [ main] testcase.SlowShutdown : Starting SlowShutdown on io with PID 30314
  2. 2020-09-01 10:51:57.410 INFO 30314 --- [ main] testcase.SlowShutdown : No active profile set, falling back to default profiles: default
  3. 2020-09-01 10:51:57.858 INFO 30314 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFERRED mode.
  4. 2020-09-01 10:51:57.873 INFO 30314 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 10ms. Found 0 JPA repository interfaces.
  5. 2020-09-01 10:51:58.095 INFO 30314 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService &#39;applicationTaskExecutor&#39;
  6. 2020-09-01 10:51:58.100 INFO 30314 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
  7. 2020-09-01 10:51:58.171 INFO 30314 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
  8. 2020-09-01 10:51:58.216 INFO 30314 --- [ task-1] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
  9. 2020-09-01 10:51:58.243 INFO 30314 --- [ task-1] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.20.Final
  10. 2020-09-01 10:51:58.274 INFO 30314 --- [ main] DeferredRepositoryInitializationListener : Triggering deferred initialization of Spring Data repositories
  11. 2020-09-01 10:51:58.274 INFO 30314 --- [ main] DeferredRepositoryInitializationListener : Spring Data repositories initialized!
  12. 2020-09-01 10:51:58.282 INFO 30314 --- [ main] testcase.SlowShutdown : Started SlowShutdown in 1.118 seconds (JVM running for 1.579)
  13. 2020-09-01 10:51:58.283 INFO 30314 --- [ main] testcase.SlowShutdown : start
  14. 2020-09-01 10:51:58.315 INFO 30314 --- [ task-1] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
  15. 2020-09-01 10:51:58.387 INFO 30314 --- [ task-1] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
  16. 2020-09-01 10:51:58.498 INFO 30314 --- [ task-1] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
  17. 2020-09-01 10:51:58.502 INFO 30314 --- [ task-1] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit &#39;default&#39;
  18. 2020-09-01 10:52:58.512 INFO 30314 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit &#39;default&#39;
  19. 2020-09-01 10:52:58.513 INFO 30314 --- [extShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down&#39;
  20. 2020-09-01 10:52:58.519 INFO 30314 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService &#39;applicationTaskExecutor&#39;
  21. 2020-09-01 10:52:58.521 INFO 30314 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
  22. 2020-09-01 10:52:58.529 INFO 30314 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.

Pom:

  1. &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  2. xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;
  3. &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  4. &lt;parent&gt;
  5. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  6. &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;
  7. &lt;version&gt;2.3.3.RELEASE&lt;/version&gt;
  8. &lt;relativePath/&gt;
  9. &lt;/parent&gt;
  10. &lt;groupId&gt;test&lt;/groupId&gt;
  11. &lt;artifactId&gt;slowshutdown&lt;/artifactId&gt;
  12. &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;
  13. &lt;name&gt;slowshutdown&lt;/name&gt;
  14. &lt;description&gt;slowshutdown&lt;/description&gt;
  15. &lt;properties&gt;
  16. &lt;java.version&gt;11&lt;/java.version&gt;
  17. &lt;/properties&gt;
  18. &lt;dependencies&gt;
  19. &lt;dependency&gt;
  20. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  21. &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;/artifactId&gt;
  22. &lt;/dependency&gt;
  23. &lt;dependency&gt;
  24. &lt;groupId&gt;com.h2database&lt;/groupId&gt;
  25. &lt;artifactId&gt;h2&lt;/artifactId&gt;
  26. &lt;scope&gt;runtime&lt;/scope&gt;
  27. &lt;/dependency&gt;
  28. &lt;/dependencies&gt;
  29. &lt;build&gt;
  30. &lt;plugins&gt;
  31. &lt;plugin&gt;
  32. &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
  33. &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
  34. &lt;/plugin&gt;
  35. &lt;/plugins&gt;
  36. &lt;/build&gt;
  37. &lt;/project&gt;

Main class:

  1. package testcase;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import org.springframework.boot.CommandLineRunner;
  5. import org.springframework.boot.SpringApplication;
  6. import org.springframework.boot.autoconfigure.SpringBootApplication;
  7. @SpringBootApplication
  8. public class SlowShutdown implements CommandLineRunner {
  9. private static final Log log = LogFactory.getLog(SlowShutdown.class);
  10. public static void main(String[] args) {
  11. SpringApplication.run(SlowShutdown.class, args);
  12. }
  13. @Override
  14. public void run(String... args) throws Exception {
  15. log.info(&quot;start&quot;);
  16. }
  17. }

答案1

得分: 4

Spring Boot 2.3版本附带了Spring Data的新主要版本。

正如他们在文档中所指出的,他们已更改了JPA存储库的默认BootstrapMode

> 从#16230开始,JPA存储库的默认BootstrapMode现在为"deferred",以改善启动时间。您可以使用spring.data.jpa.repositories.bootstrap-mode=default配置属性恢复到新的默认值。

为了避免延迟,您只需创建一个application.properties文件,并按照指示定义属性spring.data.jpa.repositories.bootstrap-mode

  1. spring.data.jpa.repositories.bootstrap-mode=default
英文:

Spring Boot 2.3 version ships with a new major release of Spring Data.

As they indicate in the documentation, they changed the default BootstrapMode for JPA repositories:

> As of #16230, the default BootstrapMode for JPA repositories is now "deferred" so as to improve startup time. You can revert that new default with the spring.data.jpa.repositories.bootstrap-mode=default configuration property.

To avoid the delay, you only need to create an application.properties file, and define the property spring.data.jpa.repositories.bootstrap-modeas indicated:

  1. spring.data.jpa.repositories.bootstrap-mode=default

答案2

得分: 3

请尝试将 @EnableJpaRepositories 添加到您的类中。

  1. @SpringBootApplication
  2. @EnableJpaRepositories
  3. public class SlowShutdown implements CommandLineRunner {
  4. }
英文:

Please try to add @EnableJpaRepositories to your class.

  1. @SpringBootApplication
  2. @EnableJpaRepositories
  3. public class SlowShutdown implements CommandLineRunner {
  4. }

huangapple
  • 本文由 发表于 2020年9月1日 17:06:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/63684579.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定