使用“@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 请求以提高性能?的主要内容,如果未能解决你的问题,请参考以下文章