当前位置: 首页 > 知识库问答 >
问题:

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

田念
2023-03-14

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

如果它能有所帮助:我们使用Postgres作为我们的数据库,EclipseLink是我们的JPA提供程序。

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

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

其中一些呼叫不相互依赖,可能同时发生。

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

  1. SELECT查询中的信息仅用于INSERT调用。因此,它们可以与<code>DELETE<code>查询并行运行
  2. 在DB级别,没有声明外键约束。这意味着我可以并行运行所有DELETE查询(这同样适用于INSERTcalls)

问题是:为什么我应该避免使用< code>@Async来优化endpoint的性能呢?

我将使用<code>CompletableFuture

例如,我脑海中的潜在陷阱:

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

该服务预计峰值为3000个请求/秒,但是这个特定的endpoint每隔几分钟才被调用一次。

共有1个答案

贝杜吟
2023-03-14

在数据库方面,并行运行它们将涉及在单独事务中的单独连接上运行它们,因此您将失去原子性特性。最后,你可能会看到他们中的一些人做出了promise,而另一些人却退缩了。

此外,如果您的数据库没有资源一次执行多个任务,那么在同一时间运行的不同查询在争夺相同资源时可能会运行得更慢,因此实际上不会更快。

 类似资料:
  • 我正在做一些研究,我正在读这一页https://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html 上面写着 Amazon S3会自动扩展到高请求率。例如,您的应用程序可以在存储桶中的每个前缀每秒至少实现3,500个PUT/POST/DELETE和5,500个GET请求。存储桶中的前缀数量没有限

  • 我有一个数据模型,在一个实体和11个其他实体之间有一对多的关系。这12个实体一起代表一个数据包。我遇到的问题是,在这些关系的“多”端发生的插入数量。其中一些可以有多达100个单独的值,因此要在数据库中保存一个完整的数据包,最多需要500次插入。 我在InnoDB表中使用MySQL 5.5。现在,通过对数据库的测试,我发现在处理批插入时,它可以轻松地每秒执行15000次插入(对于加载数据,插入次数甚

  • 本文向大家介绍请谈一谈,系统如何提高并发性?相关面试题,主要包含被问及请谈一谈,系统如何提高并发性?时的应答技巧和注意事项,需要的朋友参考一下 考察:操作系统综合性 1、提高CPU并发计算能力 (1)多进程&多线程 (2)减少进程切换,使用线程,考虑进程绑定CPU (3)减少使用不必要的锁,考虑无锁编程 (4)考虑进程优先级 (5)关注系统负载 2、改进I/O模型 (1)DMA技术 (2)异步I/

  • 问题内容: 假设我有以下示例: 例子一 现在,可能是: 例子二 关键不是实际的代码,而是使用一次以上,两次/三次或三次以上的时间。 上午我更好的性能,明智使用 例如两个 比 例如一个 (也许与解释为什么或者为什么不)? 编辑/注意 我怀疑两个更好。当我不可避免地忘记将事件处理程序添加到事件处理程序时,我有点担心的是在添加代码,而不是无意中引入了一个潜在的难以诊断的错误。那么我应该使用还是为此? 谢

  • 在花了相当长的时间在多个程序上之后,我发现,根据平台的不同,我有时需要大幅降低RAM使用率,因为某些平台上的资源非常有限。我通常按照这些类型存储大型映射和矩阵,因此从int32切换到int16或从float切换到double(如果它们实际上大小不同)可以轻松地将使用量减少近一半。因此,我刚刚添加了如下重新定义: 这使我能够快速调整程序中所有重要的基元类型。请注意,程序中的整数实际上都没有超过2字节

  • 当我直接在Azure门户的数据资源管理器中运行以下查询时,大约需要2秒才能完成。使用DocumentDB SDK运行相同的查询时,大约需要1分钟才能完成。为什么两种方法之间的性能差距如此之大,以及如何使用SDK实现相同的性能? 我们使用的代码: 我们使用Microsoft软件包。蔚蓝色的文档数据库。2.11.2. _客户端使用ConnectionMode打开。直接和协议。Tcp协议 Request