Spring Boot 应用程序启动非常慢
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/30133544/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Very slow Spring Boot application startup
提问by user3170702
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:
我有一个简单的 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
Any thoughts? Is there anything I can do to diagnose the problem?
有什么想法吗?我能做些什么来诊断问题吗?
回答by Rob Baily
For Spring Boot you can set this in your application.properties file:
对于 Spring Boot,您可以在 application.properties 文件中进行设置:
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:
我还发现我需要设置另一个属性,否则我会收到错误“org.hibernate.HibernateException:当'hibernate.dialect'未设置时,对 DialectResolutionInfo 的访问不能为空”。为了纠正我设置了这个属性:
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
This reduced our startup time from about 100 seconds down to 12.
这将我们的启动时间从大约 100 秒减少到 12 秒。
回答by user3170702
Problem solved using
使用解决的问题
properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false");
Thanks all.
谢谢大家。
回答by CAPS LOCK
Contributing application.yml
version of property setting.
application.yml
属性设置的贡献版本。
spring:
jpa:
properties:
hibernate:
temp:
use_jdbc_metadata_defaults: false
回答by KayV
For dev environment, use the following property
对于开发环境,请使用以下属性
spring.jpa.hibernate.ddl-auto=none
This would be a bit risky for staging and prod environment.
这对于 staging 和 prod 环境来说有点冒险。
回答by Dmitry Zolotukhin
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.
您是否在本地服务器上运行测试?也许数据库服务器 URL 存在一些问题,例如不可解析的主机名或 IPv6 DNS 条目,使用来自另一个应用程序(例如http://squirrel-sql.sourceforge.net/)的相同连接字符串连接可以确认问题。
The delay is definitely logged when creating the database connection for the first time (either while loading the driver or performing the connection).
第一次创建数据库连接时(加载驱动程序或执行连接时)肯定会记录延迟。
回答by NGloom
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.
我发现当db服务器很远时启动需要很长时间,在我的情况下使用localhost db时不会花费时间,并且在db在我们和服务器在jp的产品环境中需要大约20秒。