Весенняя загрузка 2.3 с JPA: завершение работы CommandLineRunner отложено

#java #spring-boot #jpa

#java #весенняя загрузка #jpa

Вопрос:

У меня есть CommandLineRunner при загрузке Spring 2.3.3 с использованием JPA, который имеет задержку в 1 минуту после завершения (см. Журнал ниже). Это происходит даже тогда, когда отсутствуют классы сущностей и нет операции JPA. Это воспроизводимо с проектом, состоящим только из в основном пустого основного класса.

Этого не произошло с версией 2.2.7, но происходит в 2.3.1. Это происходит не только в h2, но и в других базах данных (derby, oracle). Если я использую только spring-boot-starter-data-jdbc вместо spring-boot-starter-data-jpa, задержки не будет.

Есть ли какой-либо способ избежать этой задержки?

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

Пом:

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

Основной класс:

 package testcase;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class SlowShutdown implements CommandLineRunner {
  private static final Log log = LogFactory.getLog(SlowShutdown.class);

  public static void main(String[] args) {
    SpringApplication.run(SlowShutdown.class, args);
  }

  @Override
  public void run(String... args) throws Exception {
    log.info("start");
  }
}
  

Ответ №1:

Версия Spring Boot 2.3 поставляется с новым основным выпуском Spring Data.

Как указано в документации, они изменили значение по умолчанию BootstrapMode для репозиториев JPA:

Начиная с # 16230, по умолчанию BootstrapMode для репозиториев JPA теперь «отложено», чтобы увеличить время запуска. Вы можете отменить это новое значение по умолчанию с помощью spring.data.jpa.repositories.bootstrap-mode=default свойства конфигурации.

Чтобы избежать задержки, вам нужно только создать application.properties файл и определить свойство spring.data.jpa.repositories.bootstrap-mode , как указано:

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

Комментарии:

1. Кажется, это действительно решает проблему. Мне кажется странным, что переключатель, управляющий инициализацией, блокирует завершение работы.

Ответ №2:

Пожалуйста, попробуйте добавить @EnableJpaRepositories в свой класс.

 @SpringBootApplication
@EnableJpaRepositories
public class SlowShutdown implements CommandLineRunner {
}
  

Комментарии:

1. Это выглядит как естественное решение. Хотя ответ jccampaneros решает проблему завершения работы, благодаря этому я могу использовать отложенный режим для ускорения запуска.

2. Это правильно, я сосредоточил ответ только на том, чтобы предоставить вам решение для решения проблемы завершения работы, но с этой конфигурацией вы можете извлечь выгоду из отложенного режима для более быстрого запуска. Если вы так думаете, изменение, внесенное Spring Boot, направлено на то, чтобы предоставить пользователю преимущество, ускорить запуск, а в нашем коде изменение привело к прямо противоположному результату.