EJB 容器管理事务与 Bean 管理事务的性能

Performance on EJB Container Managed Transaction VS Bean Managed Transaction

关于 EJB 容器管理事务和 Bean 管理事务的比较?

谢谢

是否选择 BMT 和 CMT 取决于业务决策,而不是性能。

在我看来,没有最佳实践,但这些是一些偏爱其中之一的示例。

BMT

  1. 你有一个Stateful bean,全局提交依赖于其他方法的结果。通过将 BMT 与 Stateful 一起使用,您实际上可以让交易保持打开状态,并在您做出业务决策时 close/commit 它。
  2. 出于任何原因你想完全控制你的交易边界

CMT

  1. 您有一个 Stateful 并且您想要实现 SessionSynchronization 接口以了解事务何时开始结束等...在这种情况下,您的 bean 必须使用 CMT
  2. 您有一个 EJB 链并且您希望所有它们都成为单个事务的一部分,在这种情况下您需要使用 CMT(尽管第一个 ejb 可以启动并共享其 BMT 事务)。

有些情况下 BMT 的使用需要考虑。

  1. 如果将 BMT 与 MessageDriven 一起使用,则消息不是事务的一部分,因此容器会确认消息。
  2. 如果您是 EJB 和带有 BMT 的方法,则该方法无法加入现有事务。

Bean Managed Transaction 应该比 Container Managed Tansaction 快一点。

CMT需要做一些额外的工作,这在BMT中不需要做。

  • 容器必须检查事务是否已经开始。
  • 容器必须读取方法的@TransactionAttribute 注解。
  • 容器必须在 运行 方法之前启动新事务(如果是 TransactionAttributeType:Required,RequiresNew)或抛出异常(如果是 TransactionAttributeType:Never,Mandatory)。