带 JPA 的 Spring Boot 2.3:CommandLineRunner 完成延迟

Dru*_*nix 3 java jpa spring-boot

我在 Spring Boot 2.3.3 上有一个使用 JPA 的 CommandLineRunner,完成后有 1 分钟的延迟(请参阅下面的日志)。即使不存在实体类并且没有 JPA 操作,也会发生这种情况。它可以通过仅包含一个主要为空的主类的项目来重现。

\n

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

\n

有什么办法可以避免这种延迟吗?

\n
2020-09-01 10:51:57.408  INFO 30314 --- [           main] testcase.SlowShutdown                    : Starting SlowShutdown on io with PID 30314 \n2020-09-01 10:51:57.410  INFO 30314 --- [           main] testcase.SlowShutdown                    : No active profile set, falling back to default profiles: default\n2020-09-01 10:51:57.858  INFO 30314 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFERRED mode.\n2020-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.\n2020-09-01 10:51:58.095  INFO 30314 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'\n2020-09-01 10:51:58.100  INFO 30314 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...\n2020-09-01 10:51:58.171  INFO 30314 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.\n2020-09-01 10:51:58.216  INFO 30314 --- [         task-1] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]\n2020-09-01 10:51:58.243  INFO 30314 --- [         task-1] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.20.Final\n2020-09-01 10:51:58.274  INFO 30314 --- [           main] DeferredRepositoryInitializationListener : Triggering deferred initialization of Spring Data repositories\xe2\x80\xa6\n2020-09-01 10:51:58.274  INFO 30314 --- [           main] DeferredRepositoryInitializationListener : Spring Data repositories initialized!\n2020-09-01 10:51:58.282  INFO 30314 --- [           main] testcase.SlowShutdown                    : Started SlowShutdown in 1.118 seconds (JVM running for 1.579)\n2020-09-01 10:51:58.283  INFO 30314 --- [           main] testcase.SlowShutdown                    : start\n2020-09-01 10:51:58.315  INFO 30314 --- [         task-1] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}\n2020-09-01 10:51:58.387  INFO 30314 --- [         task-1] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect\n2020-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]\n2020-09-01 10:51:58.502  INFO 30314 --- [         task-1] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'\n2020-09-01 10:52:58.512  INFO 30314 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'\n2020-09-01 10:52:58.513  INFO 30314 --- [extShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down'\n2020-09-01 10:52:58.519  INFO 30314 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'\n2020-09-01 10:52:58.521  INFO 30314 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...\n2020-09-01 10:52:58.529  INFO 30314 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.\n
Run Code Online (Sandbox Code Playgroud)\n

波姆:

\n
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">\n  <modelVersion>4.0.0</modelVersion>\n  <parent>\n    <groupId>org.springframework.boot</groupId>\n    <artifactId>spring-boot-starter-parent</artifactId>\n    <version>2.3.3.RELEASE</version>\n    <relativePath/>\n  </parent>\n  <groupId>test</groupId>\n  <artifactId>slowshutdown</artifactId>\n  <version>0.0.1-SNAPSHOT</version>\n  <name>slowshutdown</name>\n  <description>slowshutdown</description>\n  <properties>\n    <java.version>11</java.version>\n  </properties>\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-data-jpa</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.h2database</groupId>\n      <artifactId>h2</artifactId>\n      <scope>runtime</scope>\n    </dependency>\n  </dependencies>\n  <build>\n    <plugins>\n      <plugin>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-maven-plugin</artifactId>\n      </plugin>\n    </plugins>\n  </build>\n</project>\n
Run Code Online (Sandbox Code Playgroud)\n

主要类别:

\n
package testcase;\n\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n\n@SpringBootApplication\npublic class SlowShutdown implements CommandLineRunner {\n  private static final Log log = LogFactory.getLog(SlowShutdown.class);\n\n  public static void main(String[] args) {\n    SpringApplication.run(SlowShutdown.class, args);\n  }\n\n  @Override\n  public void run(String... args) throws Exception {\n    log.info("start");\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

jcc*_*ero 5

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

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

从#16230开始,JPA 存储库的默认设置BootstrapMode现已“延迟”,以缩短启动时间。您可以使用配置属性恢复新的默认值spring.data.jpa.repositories.bootstrap-mode=default

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

spring.data.jpa.repositories.bootstrap-mode=default
Run Code Online (Sandbox Code Playgroud)