Spring Boot应用程序启动速度非常慢

时间:2015-05-08 22:06:18

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

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

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

8 个答案:

答案 0 :(得分:47)

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

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

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

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

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

答案 1 :(得分:7)

使用

解决问题
properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false");

谢谢大家。

答案 2 :(得分:4)

提供application.yml版本的属性设置。

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

答案 3 :(得分:1)

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

spring.jpa.hibernate.ddl-auto=none

这对于分期和生产环境会有些冒险。

答案 4 :(得分:1)

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

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

在使用上述配置进行此配置后,只需10秒钟。

spring:
  jpa:
    hibernate:
      ddl-auto: none

答案 5 :(得分:0)

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

第一次创建数据库连接时(无论是在加载驱动程序还是执行连接时),都会记录延迟。

答案 6 :(得分:0)

我发现启动时间很长,当数据库服务器很远时,在我的情况下使用localhost数据库时不需要时间,并且在产品环境中需要大约20秒,而db在我们这里,服务器在JP。

答案 7 :(得分:-1)

我使用了以下代码

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