本文介绍了使用`@Async`并行JPA请求以提升性能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我负责改进我们应用程序的性能。我现在正在考虑尝试让某些事情并行运行。

如果可以提供帮助的话:我们使用Postgres作为我们的数据库,而NikpseLink是我们的JPA提供程序。

这是通过Dynatrace:

可视化的请求执行(针对PUT /something终结点)的快照

每个黄色条表示SQL查询在数据库中的运行时间。

其中某些调用相互依赖,可以同时进行。

例如,考虑前9个查询(从第一个SELECT到最后一个UPDATE,包括在内):

  1. 来自SELECT查询的信息仅供INSERT调用使用。因此,它们可以与DELETE查询并行运行。
  2. 在数据库级别,没有声明外键约束。这意味着我可以并行运行所有DELETE查询(INSERT调用也是如此)。

问题是:我应该避免使用@Async来优化端点性能的原因可能是什么?

我将使用CompletableFuture,如Spring's @Async documentation中所述。

例如,我考虑的潜在陷阱:

  • 当服务处于压力负载时,可能会导致性能下降的线程管理。
  • EntityManager不是线程安全的。
  • 异常处理。

该服务预期的峰值为每秒3000个请求,但此特定终结点将每隔几分钟才被调用一次。

推荐答案

在数据库端,并行运行它们将涉及在不同事务中的不同连接上运行它们,因此您将失去原子性特性。你可能最终会让他们中的一些人做出承诺,而另一些人则会回滚。

另外,如果您的数据库没有同时执行多项任务的资源,则同时运行的不同查询可能会各自运行得较慢,因为它们争夺相同的资源,因此实际上并不是更快。

这篇关于使用`@Async`并行JPA请求以提升性能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-22 20:52