我们在 StatelessSessionBean 中有一个性能不佳的业务方法。为了提高性能,我们希望将此业务方法拆分为几个异步方法调用。
问题是这些异步方法必须在同一个事务中运行(它们必须使用同一个 JPA 实体管理器)。据我了解 Java EE 规范,这是不可能使用容器管理事务的。是否可以使用 bean 管理的事务或其他机制来实现这一要求?
我们在 StatelessSessionBean 中有一个性能不佳的业务方法。为了提高性能,我们希望将此业务方法拆分为几个异步方法调用。
问题是这些异步方法必须在同一个事务中运行(它们必须使用同一个 JPA 实体管理器)。据我了解 Java EE 规范,这是不可能使用容器管理事务的。是否可以使用 bean 管理的事务或其他机制来实现这一要求?
您不能这样做,无论是使用标准 EJB 还是使用任何扩展。事务与数据库连接相关联,这意味着您必须在多个线程之间共享该连接。这是不安全的。
此外,由于某种原因,异步代码可能会以较大的延迟执行,例如在高 CPU 负载下。这将使您的交易保持不必要的长时间开放。
你有什么选择?首先,并行化 SQL 查询(尤其是写入 - 您需要将它们放在一个事务中)不会给您带来太多好处。数据库通常受 I/O 限制。仅当您有 CPU 密集型任务或正在等待某些事情时,并行化才值得您花时间。
在这两种情况下,重新设计您的代码以在多个线程中执行并行代码,并且只有一个编写器线程来处理数据库和事务。例如,如果您需要调用 10 个服务器,收集响应并存储它们 - 生成 10 个线程/使用一个池,等待结果并将它们全部存储在一个线程中。