Spring Boot 启动构建 JPA 容器非常慢

Posted

技术标签:

【中文标题】Spring Boot 启动构建 JPA 容器非常慢【英文标题】:Spring boot start up Building JPA container very slow 【发布时间】:2019-03-01 19:21:15 【问题描述】:

我正在使用带有 JPA 的 Spring Boot,它最近开始需要很长时间才能启动。它总是卡在控制台的这条线上大约 5 分钟:

Building JPA container EntityManagerFactory for persistence unit 'default'

我看过这个相关的帖子:Very slow Spring Boot application startup 并尝试将 spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false 添加到我的 application.properties 但这根本没有任何区别。

有什么办法可以调试这段时间spring boot实际上在做什么? 我的gradle依赖如下:

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-tomcat')
compile('org.springframework.boot:spring-boot-starter-data-redis')
compile('org.springframework.boot:spring-boot-starter-mail')
compile('org.springframework.session:spring-session:1.3.1.RELEASE')
compile('mysql:mysql-connector-java')
compile('org.apache.commons:commons-lang3:3.7')
compile('com.google.cloud:google-cloud-storage:1.14.0')
compile('javaxt:javaxt-core:1.8.1')
compile('org.hibernate:hibernate-envers:5.0.12.Final')
testCompile('org.springframework.boot:spring-boot-starter-test')

我使用的是 Spring Boot 版本 1.5.9.RELEASE

我的 application.properties 有这个:

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://notreal.server.com:3306/testdb
spring.datasource.username=NotRealUser
spring.datasource.password=NotRealPwd
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

非常感谢任何建议/帮助。

【问题讨论】:

升级你的系统配置 将所有内容的日志级别设置为 TRACE 【参考方案1】:

我设法通过在我的 application.properties 中设置 spring.jpa.hibernate.ddl-auto=none(之前设置为 auto)解决了我的问题。

我认为这可以防止 Hibernate 尝试将对象模型与数据库中的表进行比较。之后 Springboot 启动要快得多。

我应该提一下,那时我们还在项目中添加了 Hibernate Envers(审计框架),它在数据库中生成了一堆新表。所以这可能使问题更加复杂。

【讨论】:

【参考方案2】:

在 Hashicorp Nomad 内部也有同样的问题。适用于任何分配内存的系统。

如果您查看系统日志(不是 Spring Apps),您会发现此步骤更占用内存。增加应用程序的内存,它应该运行spring.jpa.hibernate.ddl-auto=auto

【讨论】:

以上是关于Spring Boot 启动构建 JPA 容器非常慢的主要内容,如果未能解决你的问题,请参考以下文章

带有 Axon 的 Spring Boot JPA

在我的 spring-boot 应用程序启动之前,我如何等待数据库容器启动

spring boot系列01--快速构建spring boot项目

Spring Boot-------JPA——EntityManager构建通用DAO

Spring Boot Docker 应用程序

Spring boot JPA