本文介绍了使用`@Async`并行JPA请求以提升性能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我负责改进我们应用程序的性能。我现在正在考虑尝试让某些事情并行运行。
如果可以提供帮助的话:我们使用Postgres作为我们的数据库,而NikpseLink是我们的JPA提供程序。
这是通过Dynatrace:
可视化的请求执行(针对PUT /something
终结点)的快照每个黄色条表示SQL查询在数据库中的运行时间。
其中某些调用不相互依赖,可以同时进行。
例如,考虑前9个查询(从第一个SELECT
到最后一个UPDATE
,包括在内):
- 来自
SELECT
查询的信息仅供INSERT
调用使用。因此,它们可以与DELETE
查询并行运行。 - 在数据库级别,没有声明外键约束。这意味着我可以并行运行所有
DELETE
查询(INSERT
调用也是如此)。
问题是:我应该避免使用@Async
来优化端点性能的原因可能是什么?
我将使用CompletableFuture
,如Spring's @Async
documentation中所述。
例如,我考虑的潜在陷阱:
- 当服务处于压力负载时,可能会导致性能下降的线程管理。
EntityManager
不是线程安全的。- 异常处理。
该服务预期的峰值为每秒3000个请求,但此特定终结点将每隔几分钟才被调用一次。
推荐答案
在数据库端,并行运行它们将涉及在不同事务中的不同连接上运行它们,因此您将失去原子性特性。你可能最终会让他们中的一些人做出承诺,而另一些人则会回滚。
另外,如果您的数据库没有同时执行多项任务的资源,则同时运行的不同查询可能会各自运行得较慢,因为它们争夺相同的资源,因此实际上并不是更快。
这篇关于使用`@Async`并行JPA请求以提升性能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!