EJB与CDI以及“实体边界控制”模式比较

7
我正在努力理解CDI和EJB以及实体边界控制(ECB)模式。我对ECB模式的理解是边界是事务边界的起点和终点。此外,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。
谢谢。

我只是想确认一下,我提到的三个点是否正确?或者我的想法是错误的。 - vcetinick
1个回答

13

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

  • 带有JAX-RS注释的无状态EJB来实现REST服务作为边界
  • @Dependent范围下的CDI管理bean用于业务逻辑作为控制器
  • @Dependent范围内的CDI管理bean用于数据访问对象,这些对象使用JPA的EntityManager与数据库交互
  • JPA实体bean

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

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

对于我的应用程序,使用更重量级、池化的EJB作为边界和轻量级的CDI管理bean组合表现非常好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接