3

我们在 StatelessSessionBean 中有一个性能不佳的业务方法。为了提高性能,我们希望将此业务方法拆分为几个异步方法调用。

问题是这些异步方法必须在同一个事务中运行(它们必须使用同一个 JPA 实体管理器)。据我了解 Java EE 规范,这是不可能使用容器管理事务的。是否可以使用 bean 管理的事务或其他机制来实现这一要求?

4

1 回答 1

4

您不能这样做,无论是使用标准 EJB 还是使用任何扩展。事务与数据库连接相关联,这意味着您必须在多个线程之间共享该连接。这是不安全的。

此外,由于某种原因,异步代码可能会以较大的延迟执行,例如在高 CPU 负载下。这将使您的交易保持不必要的长时间开放。

你有什么选择?首先,并行化 SQL 查询(尤其是写入 - 您需要将它们放在一个事务中)不会给您带来太多好处。数据库通常受 I/O 限制。仅当您有 CPU 密集型任务或正在等待某些事情时,并行化才值得您花时间。

在这两种情况下,重新设计您的代码以在多个线程中执行并行代码,并且只有一个编写器线程来处理数据库和事务。例如,如果您需要调用 10 个服务器,收集响应并存储它们 - 生成 10 个线程/使用一个池,等待结果并将它们全部存储在一个线程中。

也可以看看

于 2012-05-11T10:52:53.340 回答