gpt4 book ai didi

postgresql - 重启 Spring Boot 应用程序后首次调用速度慢

转载 作者:行者123 更新时间:2023-11-29 11:57:56 25 4
gpt4 key购买 nike

我们有一个使用 Postgres、Hibernate、Jackson 和 Spring Data Rest 的 React - Spring Boot 应用程序。

每次应用程序重新启动后,对到达我们后端服务器之一的后路由的第一次调用很长(超过 4 秒)。对到达每个服务器的同一路由的每个后续调用都在 100 毫秒以下。

我们的目标是保证我们的用户在每次重新部署后都不会受到这些缓慢调用的影响。

我们正在考虑在每次部署后自动触发调用,以便应用程序“预热”并且我们的客户不会进行长时间调用。

由于负载均衡器后面有多个后端服务器,我们希望直接从后端而不是客户端触发这些调用。

我们想更好地了解会发生什么,以便我们更有效地解决这个问题:它可以是 Hibernate 吗? Spring 延迟加载 bean? jackson ?

Hibernate L2 缓存未激活。

我们希望每次都有相同的快速响应时间(< 100 毫秒),而不是最初的 4 秒调用。

最佳答案

我们遵循@willermo 的回答以及来自另一个论坛的一些提示进行快速更新,引导我们朝着正确的方向解决问题。

我们使用 -verbose:class 标志记录了类加载,这清楚地表明问题是类在第一次调用时被延迟加载。

为了预加载这些类,我们使用 ApplicationRunner 来触发应用程序启动时的调用,正如@willermo 所建议的那样;这使我们能够通过对每个服务器进行一次调用来确定性地预热负载均衡器后面的所有服务器。

有几个额外的障碍很容易解决:

  • 添加 ApplicationRunner 破坏了我们所有的测试,因此我们不得不将其从测试配置文件中排除。
  • 我们不想让这些“虚假”调用对数据库的影响持续存在,因此我们将它们包装在一个我们最终回滚的事务中。

这是我们的最终解决方案:

@Component
@Profile("!test")
public class AppStartupRunner implements ApplicationRunner {

// [Constructor with injected dependencies]

@Transactional
@Override
public void run(ApplicationArguments args) throws Exception {
// [Make the calls]
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}

关于postgresql - 重启 Spring Boot 应用程序后首次调用速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57312745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com