spring-boot - 如何减少弹簧启动时间
问题描述
我们正在尝试将我们的 Spring Boot 应用程序部署到 AWS Lamda 中。通过 API 网关触发 API 时,启动需要更多时间(28 到 30 秒),因此我收到超时错误作为响应。我们将 Lamda 内存配置为 512 MB。
也尝试了以下更改:
- 从 pom 文件中删除了未使用的依赖项。
- 为数据库连接进行了静态配置。
- 将 spring.jpa.hibernate.ddl-auto 配置为 none 以避免数据库初始化。
- 使用 spring.main.lazy-initialization=true
- 通过@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: []
解决方案
对于第一次启动,通常带有 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'
希望您没有使用休眠的模式自动更新功能,因为那样它也会在那里花费一些时间。
推荐阅读
- python - pytest 中有没有办法从夹具中获取参数化测试节点 ID 的列表?
- python - 在嘈杂的二进制时间序列中找到连续信号
- amazon-web-services - 将文件从一个 S3 存储桶传输到另一个存储桶的最便宜方式是什么?
- azure - 我的服务器端 Blazor 应用程序的计数器在部署到 Azure 时没有增加
- java - Dynamics 365 OData 过滤来自 ComplexType 的数据
- three.js - 两个物体不投射阴影,而另一个物体投射阴影
- r - 如何在数据框中添加与行数一样多的行
- excel - 从电源查询更新表会更改公式参考
- python - 连接多行字符串,同时保留每个字符串的样式
- r - 在 R 中:如何每天根据某一列中的最大值聚合整行?