使用“@Async”并行 JPA 请求以提高性能?

Posted

技术标签:

【中文标题】使用“@Async”并行 JPA 请求以提高性能?【英文标题】:Parallel JPA requests with `@Async` to boost performance? 【发布时间】:2022-01-04 20:54:22 【问题描述】:

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

如果有帮助的话:我们使用 Postgres 作为我们的数据库,而 EclipseLink 是我们的 JPA 提供者。

这是通过 Dynatrace 可视化的请求执行(针对我们的 PUT /something 端点)的快照:

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

其中一些调用相互依赖,可能同时发生。

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

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

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

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

例如,我想到的潜在陷阱:

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

该服务预计峰值为 3000 个请求/秒,但此特定端点每隔几分钟只会被调用一次。

【问题讨论】:

【参考方案1】:

在数据库方面,并行运行它们将涉及在不同事务中的不同连接上运行它们,因此您将失去原子性功能。您最终可能会导致其中一些提交,而另一些则回滚。

此外,如果您的数据库没有资源同时执行多项操作,同时运行的不同查询可能会在争夺相同资源时各自运行较慢,因此实际上并不会更快。

【讨论】:

以上是关于使用“@Async”并行 JPA 请求以提高性能?的主要内容,如果未能解决你的问题,请参考以下文章

在控制器中使用 @Async 和 CompletableFuture 可以提高我们 api 的性能吗?

r 并行化RDS压缩/解压缩以提高R中的序列化性能

使用并行异步请求处理错误

优化程序性能——提高并行性

JPA SQL Server 批量插入

JPA 批量插入不会提高性能