【问题标题】:Very slow Spring Boot application startup非常慢的 Spring Boot 应用程序启动
【发布时间】:2015-07-19 22:38:02
【问题描述】:

我有一个简单的 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 尝试错误的地址......无论如何,下面的解决方案可以解决所有情况下的问题。

标签: spring postgresql spring-boot spring-data spring-data-jpa


【解决方案1】:

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

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 秒。

【讨论】:

  • 在 MacOS 10+ 上,您可以在终端 scutil --set HostName "localhost" 上执行。我认为是解决网络主机的问题。
  • 这有助于解决部分问题。现在 HibernateSessionFactory 的其他东西似乎正在导致速度变慢。
  • @ThiagoPereira 你拯救了我的一天 ;-)
  • 非常好,工作就像一个魅力。不确定我们是否有任何副作用。
【解决方案2】:

问题解决了

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

谢谢大家。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      spring.jpa.hibernate.ddl-auto=none
      

      这对于 staging 和 prod 环境会有点风险。

      【讨论】:

        【解决方案5】:

        当我指向 AWS RDS 服务器中的数据库时,需要 78 秒。 给定此配置后,需要 52 秒。

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

        在上面的配置中给出这个配置后,只需要 10 秒。

        spring:
          jpa:
            hibernate:
              ddl-auto: none
        

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 服务器是远程的,但使用 pgAdmin 连接只需几秒钟。并且驱动程序似乎在问题发生之前已加载(我添加了更多日志记录)。
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            我使用了下面这段代码

            spring:
                jpa:
                    database-platform: org.hibernate.dialect.PostgreSQLDialect
                    show-sql: false
                    generate-ddl: true
                    **hibernate:
                        ddl-auto: none
                    properties:
                        hibernate.hbm2ddl.auto: none**
            

            【讨论】:

              猜你喜欢
              • 2015-04-04
              • 1970-01-01
              • 2020-12-24
              • 1970-01-01
              • 1970-01-01
              • 2019-03-01
              • 1970-01-01
              • 2010-12-12
              • 1970-01-01
              相关资源
              最近更新 更多