Spring Boot应用程序启动非常缓慢

43

我有一个简单的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

有什么想法吗?有没有什么我可以做来诊断问题?


我也遇到了这个问题,即使数据库在我的机器上!我注意到它取决于我的机器连接的网络。在家里没有问题,一切都很快。如果我在工作中,有代理和防火墙随处可见,启动会在方言解析之前挂起...也许Hibernate尝试错误的地址....无论如何,下面的解决方案可以解决所有情况下的问题。 - Gauthier Peel
10个回答

66

对于Spring Boot,您可以在应用程序属性文件中进行以下设置:

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

我还发现我需要设置另一个属性,否则我会得到错误信息"org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set"。为了纠正这个问题,我设置了这个属性:

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

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


2
在MacOS 10+上,您可以在终端上执行“scutil --set HostName“localhost”命令。我认为这是解决网络主机的问题。 - Thiago Pereira
这有助于解决部分问题。现在,与HibernateSessionFactory相关的另一件事似乎导致了减速。 - Kent Bull

11

使用以下方法解决问题:

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

谢谢大家。


10

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

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

4

当我指向 AWS RDS 服务器中的数据库时,需要 78 秒钟。 在进行了配置后,只需要 52 秒钟。

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

在使用以上配置的情况下,经过此配置设置后仅需10秒。

spring:
  jpa:
    hibernate:
      ddl-auto: none

这个解决方案将我的启动时间从8分钟缩短到几秒钟!!太棒了! - undefined

2

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

spring.jpa.hibernate.ddl-auto=none

这对于预发布和生产环境来说有一定的风险。

0

对于Spring Boot Data JPA,您需要在application.properties文件中添加spring.data.jpa.repositories.bootstrap-mode=lazy,这也可以降低启动时间。

spring.data.jpa.repositories.bootstrap-mode=lazy
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

0

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

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


服务器是远程的,但使用pgAdmin连接只需几秒钟。而且在问题发生之前似乎已加载驱动程序(我增加了一些日志记录)。 - user3170702

0

我发现在数据库服务器距离较远时启动时间较长,在我的情况下,使用本地主机的数据库不需要时间,而在产品环境中,当数据库在美国而服务器在日本时,需要约20秒钟。


0
也许你可以使用项目spring-startup-analyzer来分析Spring应用的启动时间。
它会生成一个交互式的Spring应用启动报告,让你了解是什么导致了应用的启动时间,并帮助优化它。

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

-1
我使用了以下代码片段。
spring:
    jpa:
        database-platform: org.hibernate.dialect.PostgreSQLDialect
        show-sql: false
        generate-ddl: true
        **hibernate:
            ddl-auto: none
        properties:
            hibernate.hbm2ddl.auto: none**

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接