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?
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.
Problem gelöst mit
properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false");
Danke euch allen.
application.yml
-Version der Eigenschaftseinstellung beitragen.
spring:
jpa:
properties:
hibernate:
temp:
use_jdbc_metadata_defaults: false
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).
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.
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.