首页 > 解决方案 > 如何减少弹簧启动时间

问题描述

我们正在尝试将我们的 Spring Boot 应用程序部署到 AWS Lamda 中。通过 API 网关触发 API 时,启动需要更多时间(28 到 30 秒),因此我收到超时错误作为响应。我们将 Lamda 内存配置为 512 MB。

也尝试了以下更改:

  1. 从 pom 文件中删除了未使用的依赖项。
  2. 为数据库连接进行了静态配置。
  3. 将 spring.jpa.hibernate.ddl-auto 配置为 none 以避免数据库初始化。
  4. 使用 spring.main.lazy-initialization=true
  5. 通过@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

欢迎大家提出意见。

添加日志:

.   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
'  |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::                        
2021-09-27 09:08:38.938  INFO 1 --- [           main] lambdainternal.LambdaRTEntry             : Starting LambdaRTEntry using Java 1.8.0_302 on 169.254.30.181 with PID 1 (/var/runtime/lib/LambdaJavaRTEntry-1.0.jar started by sbx_user1051 in /)
2021-09-27 09:08:38.941  INFO 1 --- [           main] lambdainternal.LambdaRTEntry             : No active profile set, falling back to default profiles: default
2021-09-27 09:08:43.719  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-09-27 09:08:44.748  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 983 ms. Found 20 JPA repository interfaces.
2021-09-27 09:08:47.871  INFO 1 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-09-27 09:08:48.085  INFO 1 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version [WORKING]
2021-09-27 09:08:48.906  INFO 1 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-09-27 09:08:49.322  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2021-09-27 09:08:50.697  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2021-09-27 09:08:50.779  INFO 1 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
2021-09-27 09:08:57.684  INFO 1 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2021-09-27 09:08:57.759  INFO 1 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2021-09-27 09:09:07.124  INFO 1 --- [           main] lambdainternal.LambdaRTEntry             : Started LambdaRTEntry in 30.106 seconds (JVM running for 31.393)
2021-09-27 09:09:07.188  INFO 1 --- [           main] c.f.c.c.BeanFactoryAwareFunctionRegistry : Looking up function 'function' with acceptedOutputTypes: []
2021-09-27 09:09:07.190  WARN 1 --- [           main] c.f.c.c.BeanFactoryAwareFunctionRegistry : !!! Failed to discover function 'function' in function catalog. Function available in catalog are: [lamdaFunction, functionRouter]
2021-09-27 09:09:07.190  INFO 1 --- [           main] c.f.c.c.BeanFactoryAwareFunctionRegistry : Looking up function 'consumer' with acceptedOutputTypes: []
2021-09-27 09:09:07.190  WARN 1 --- [           main] c.f.c.c.BeanFactoryAwareFunctionRegistry : !!! Failed to discover function 'consumer' in function catalog. Function available in catalog are: [lamdaFunction, functionRouter]
2021-09-27 09:09:07.191  INFO 1 --- [           main] c.f.c.c.BeanFactoryAwareFunctionRegistry : Looking up function 'supplier' with acceptedOutputTypes: []
2021-09-27 09:09:07.191  WARN 1 --- [           main] c.f.c.c.BeanFactoryAwareFunctionRegistry : !!! Failed to discover function 'supplier' in function catalog. Function available in catalog are: [lamdaFunction, functionRouter]
2021-09-27 09:09:07.192  INFO 1 --- [           main] c.f.c.c.BeanFactoryAwareFunctionRegistry : Looking up function 'lamdaFunction' with acceptedOutputTypes: []

标签: spring-boothibernateaws-lambdaaws-api-gateway

解决方案


对于第一次启动,通常带有 Hibernate 的 Spring Boot 不适用于 Lambdas 等快速启动环境。这里提到的可以尝试的技术很少,或者像Quarkus这样的替代解决方案更适合。许多人还走上了通过 ping 永久加热 lambda 的路线。

您的连接池 (HikariCP) 设置非常快,因此看起来不像是数据库连接问题

2021-09-27 09:08:49.322 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 
2021-09-27 09:08:50.697 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.

您的大部分时间似乎都花在了加载 Spring 类和设置上(大约 5 秒)

2021-09-27 09:08:38.941 INFO 1 --- [ main] lambdainternal.LambdaRTEntry : No active profile set, falling back to default profiles: default 
2021-09-27 09:08:43.719 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT 

还有 Hibernate 设置(扫描实体,创建自动生成的查询等) - 大约 10 秒

2021-09-27 09:08:47.871 INFO 1 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2021-09-27 09:08:48.085 INFO 1 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version [WORKING] 2021-09-27 09:08:48.906 INFO 1 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 
2021-09-27 09:08:49.322 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 
2021-09-27 09:08:50.697 INFO 1 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 
2021-09-27 09:08:50.779 INFO 1 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect 2021-09-27 09:08:57.684 INFO 1 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 
2021-09-27 09:08:57.759 INFO 1 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'

希望您没有使用休眠的模式自动更新功能,因为那样它也会在那里花费一些时间。


推荐阅读