user3170702
user3170702

Reputation: 2061

Very slow Spring Boot application startup

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:

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?

Upvotes: 44

Views: 36174

Answers (10)

林贻民
林贻民

Reputation: 11

Perhaps you could use the project spring-startup-analyzer to analyze startup time of spring application.

It generates an interactive Spring application startup report that lets you understand what contributes to the application startup time and helps to optimize it.

Upvotes: 1

Mohsin AR
Mohsin AR

Reputation: 3108

For springboot data JPA you need to add spring.data.jpa.repositories.bootstrap-mode=lazy in application.properties file this would also reduce bootup time.

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

Upvotes: 1

Akram Khan
Akram Khan

Reputation: 123

When I point to database in AWS RDS server it takes 78 seconds. After given this configuration it takes 52 seconds.

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

And after given this configuration with the above configuration it takes only 10 seconds.

spring:
  jpa:
    hibernate:
      ddl-auto: none

Upvotes: 5

Mischief_managed
Mischief_managed

Reputation: 54

I used the following piece of code

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

Upvotes: -1

KayV
KayV

Reputation: 13835

For dev environment, use the following property

spring.jpa.hibernate.ddl-auto=none

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

Upvotes: 2

CAPS LOCK
CAPS LOCK

Reputation: 2040

Contributing application.yml version of property setting.

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

Upvotes: 11

Rob Baily
Rob Baily

Reputation: 3019

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

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:

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

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

Upvotes: 68

user3170702
user3170702

Reputation: 2061

Problem solved using

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

Thanks all.

Upvotes: 13

NGloom
NGloom

Reputation: 408

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.

Upvotes: 0

Dmitry Zolotukhin
Dmitry Zolotukhin

Reputation: 99

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.

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

Upvotes: 0

Related Questions