Spring Boot 应用程序启动非常慢

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/30133544/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 00:33:54  来源:igfitidea点击:

Very slow Spring Boot application startup

springpostgresqlspring-bootspring-dataspring-data-jpa

提问by user3170702

I have a simple Spring Boot application that connects to a PostgreSQL database and serves as a JSON service. Somehow the startup has become very slow, see timings 10:37:10 and 10:38:00:

我有一个简单的 Spring Boot 应用程序,它连接到 PostgreSQL 数据库并用作 JSON 服务。不知何故,启动变得很慢,请参阅时间 10:37:10 和 10:38:00:

2015-05-09 10:37:09.649  INFO 20880 --- [lication.main()] o.apache.catalina.core.StandardService   : Starting service Tomcat
2015-05-09 10:37:09.651  INFO 20880 --- [lication.main()] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.0.20
2015-05-09 10:37:09.767  INFO 20880 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2015-05-09 10:37:09.767  INFO 20880 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2970 ms
2015-05-09 10:37:09.979  INFO 20880 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2015-05-09 10:37:09.985  INFO 20880 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]
2015-05-09 10:37:10.105  INFO 20880 --- [lication.main()] o.s.j.d.DriverManagerDataSource          : Loaded JDBC driver: org.postgresql.Driver
2015-05-09 10:37:10.214  INFO 20880 --- [lication.main()] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2015-05-09 10:37:10.233  INFO 20880 --- [lication.main()] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
    name: default
    ...]
2015-05-09 10:37:10.585  INFO 20880 --- [lication.main()] org.hibernate.Version                    : HHH000412: Hibernate Core {4.3.8.Final}
2015-05-09 10:37:10.587  INFO 20880 --- [lication.main()] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2015-05-09 10:37:10.589  INFO 20880 --- [lication.main()] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
2015-05-09 10:37:10.968  INFO 20880 --- [lication.main()] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
2015-05-09 10:38:00.023  INFO 20880 --- [lication.main()] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
2015-05-09 10:38:00.041  INFO 20880 --- [lication.main()] o.h.e.jdbc.internal.LobCreatorBuilder    : HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
2015-05-09 10:38:00.274  INFO 20880 --- [lication.main()] o.h.h.i.ast.ASTQueryTranslatorFactory    : HHH000397: Using ASTQueryTranslatorFactory

Any thoughts? Is there anything I can do to diagnose the problem?

有什么想法吗?我能做些什么来诊断问题吗?

回答by Rob Baily

For Spring Boot you can set this in your application.properties file:

对于 Spring Boot,您可以在 application.properties 文件中进行设置:

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

I also found that I needed to set another property or I would get the error "org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set". To rectify that I set this property:

我还发现我需要设置另一个属性,否则我会收到错误“org.hibernate.HibernateException:当'hibernate.dialect'未设置时,对 DialectResolutionInfo 的访问不能为空”。为了纠正我设置了这个属性:

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

This reduced our startup time from about 100 seconds down to 12.

这将我们的启动时间从大约 100 秒减少到 12 秒。

回答by user3170702

Problem solved using

使用解决的问题

properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false");

Thanks all.

谢谢大家。

回答by CAPS LOCK

Contributing application.ymlversion of property setting.

application.yml属性设置的贡献版本。

spring:
  jpa:
    properties:
      hibernate:
        temp:
          use_jdbc_metadata_defaults: false

回答by KayV

For dev environment, use the following property

对于开发环境,请使用以下属性

spring.jpa.hibernate.ddl-auto=none

This would be a bit risky for staging and prod environment.

这对于 staging 和 prod 环境来说有点冒险。

回答by Dmitry Zolotukhin

Are you running the tests on a local server? Perhaps there's some problem with the database server URL, such as a non-resolvable hostname or an IPv6 DNS entry, connecting with the same connection string from another application (e.g. http://squirrel-sql.sourceforge.net/) could confirm the problem.

您是否在本地服务器上运行测试?也许数据库服务器 URL 存在一些问题,例如不可解析的主机名或 IPv6 DNS 条目,使用来自另一个应用程序(例如http://squirrel-sql.sourceforge.net/)的相同连接字符串连接可以确认问题。

The delay is definitely logged when creating the database connection for the first time (either while loading the driver or performing the connection).

第一次创建数据库连接时(加载驱动程序或执行连接时)肯定会记录延迟。

回答by NGloom

I found the startup takes long time when the db server is far, in my case it won't take time when using the localhost db, and it take about 20 seconds in product enviroment with db is in us and server is in jp.

我发现当db服务器很远时启动需要很长时间,在我的情况下使用localhost db时不会花费时间,并且在db在我们和服务器在jp的产品环境中需要大约20秒。