EJB 与 CDI 以及"Entity Boundary Control"模式



我试图得到我的头围绕CDI和EJB和实体边界控制(ECB)模式。我对欧洲央行模式的理解是,边界是交易边界的开始和结束。此外,CDI不像EJB那样提供事务支持。

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

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

谢谢

我成功地在JavaEE 6中实现了ECB模式,仅使用EJB的边界和CDI的控制器。在我的体系结构中,典型的堆栈使用

    用JAX-RS注释的无状态EJB实现REST服务作为边界
  • @Dependent作用域中用于业务逻辑的CDI管理bean作为Controller
  • 使用JPA的EntityManager与数据库交互的数据访问对象的@Dependent作用域中的CDI管理bean
  • JPA实体bean

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

通过仅为CDI托管bean使用@Dependent作用域,您可以确保每个线程都有自己的bean实例。因此,不会有多个线程同时访问CDI托管bean。这样做可以避免典型的并发性问题。

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

最新更新