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