#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, направлено на то, чтобы предоставить пользователю преимущество, ускорить запуск, а в нашем коде изменение привело к прямо противоположному результату.