7

我试图了解 CDI 和 EJB 以及实体边界控制 (ECB) 模式。我对ECB模式的理解是Boundary是事务边界的开始和结束。此外,CDI 不像 EJB 那样提供事务支持。

因此,如果我想成功实现 ECB 模式,那么以下是正确的;

  1. 我可以用 EJB(即@stateless、@stateful、@singleton)实现边界部分,用 CDI 或 EJB 实现控制层。
  2. 我可以使用 CDI 实现边界和控制部分,但在边界中实现事务支持,类似于 (http://smokeandice.blogspot.com/2009/12/cdi-and-declarative-transactions.html)
  3. 我无法使用 CDI 实现边界,然后在控制层中开始使用 EJB。

谢谢

4

1 回答 1

13

我在 JavaEE 6 中成功地实现了 ECB 模式,仅将 EJB 用于边界,将 CDI 用于控制器。我的架构中的一个典型堆栈使用

  • 使用 JAX-RS 注释进行注释的无状态 EJB 以将 REST 服务实现为边界
  • @Dependent 范围内作为控制器的业务逻辑的 CDI 托管 bean
  • 使用 JPA 的 EntityManager 与数据库交互的数据访问对象的 @Dependent 范围内的 CDI 托管 bean
  • JPA 实体 bean

构成边界的无状态 EJB 始终使用默认的 @TransactionAttribute(REQUIRED) 进行注释。我不使用其他交易属性。这样做,您可以确保与边界的每次交互都发生在一个事务中。

通过仅对 CDI 托管 bean 使用 @Dependent 范围,您可以确保每个线程都有自己的该 bean 实例。因此,您永远不会有多个线程同时访问 CDI 托管 bean。这样做可以防止您遇到典型的并发问题。

结合使用更重的、用于边界的池化 EJB 和用于应用程序其余部分的轻量级 CDI 托管 bean 对我来说效果非常好。

于 2012-01-06T18:39:19.657 回答