wake-up-neo.com

Sehr langsamer Start der Spring Boot-Anwendung

Ich habe eine einfache Spring Boot-Anwendung, die eine Verbindung zu einer PostgreSQL-Datenbank herstellt und als JSON-Dienst dient. Irgendwie ist der Start sehr langsam geworden, siehe Timings 10:37:10 und 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

Irgendwelche Gedanken? Kann ich irgendetwas tun, um das Problem zu diagnostizieren?

23
user3170702

Für Spring Boot können Sie dies in Ihrer Datei application.properties einstellen:

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

Ich fand auch, dass ich eine andere Eigenschaft festlegen musste, oder ich würde die Fehlermeldung erhalten "org.hibernate.HibernateException: Zugriff auf DialectResolutionInfo kann nicht null sein, wenn 'hibernate.dialect' nicht festgelegt ist". Um das zu korrigieren, setze ich diese Eigenschaft:

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

Dies reduziert unsere Startzeit von etwa 100 Sekunden auf 12 Sekunden.

40
Rob Baily

Problem gelöst mit

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

Danke euch allen.

7
user3170702

application.yml-Version der Eigenschaftseinstellung beitragen.

spring:
  jpa:
    properties:
      hibernate:
        temp:
          use_jdbc_metadata_defaults: false
3
CAPS LOCK

Führen Sie die Tests auf einem lokalen Server aus? Möglicherweise gibt es ein Problem mit der Datenbankserver-URL, z. B. ein nicht auflösbarer Hostname oder ein IPv6-DNS-Eintrag, bei dem die Verbindung mit derselben Verbindungszeichenfolge aus einer anderen Anwendung hergestellt wird (z. B. http://squirrel-sql.sourceforge.net/ ) könnte das Problem bestätigen.

Die Verzögerung wird definitiv protokolliert, wenn die Datenbankverbindung zum ersten Mal erstellt wird (entweder beim Laden des Treibers oder beim Herstellen der Verbindung).

0

Ich habe festgestellt, dass der Startvorgang sehr lange dauert, wenn der db-Server weit ist, in meinem Fall dauert es nicht, wenn der localhost-db verwendet wird, und es dauert ungefähr 20 Sekunden in der Produktumgebung mit db in uns und der Server in jp.

0
NGloom

Verwenden Sie für die dev-Umgebung die folgende Eigenschaft

spring.jpa.hibernate.ddl-auto=none

Dies wäre ein bisschen riskant für die Inszenierung und die Produktumgebung.

0
KayV