【问题标题】:Why use stateless session beans for transaction demarcation为什么使用无状态会话 bean 进行事务划分
【发布时间】:2013-10-05 05:13:05
【问题描述】:

我经常发现自己将 @AppplicationScoped bean 转换为 SLSB bean,以便我可以使用 @TransactionalAttribute。

与创建自定义 CDI 拦截器来开始和结束我可以在任何 bean 上使用的事务相比,这样做有什么优势?

【问题讨论】:

  • Apache DeltaSpike 就是这样做的,如果它最终成为 CDI 规范,我不会感到惊讶。

标签: jakarta-ee transactions ejb cdi


【解决方案1】:

实际上,@Transactional 在与 Java EE 7 一起出现的新 CDI 规范中已经实现,因此您可以将其应用于应用程序中的所有托管 Bean,它的工作方式与 @TransactionalAttribute 相同。查看documentation 了解更多信息。

CDI 与 EJB

区别很简单,如果您不需要调度、远程 bean、异步行为或安全性等内容,请始终使用CDI。有关这些功能是什么以及如何实现它们,请参阅任何类型的教程。另请注意,如果您使用 CDI,那么应用程序中的每个类都将有效地转入 Managed Bean,包括 EJB bean。

【讨论】:

  • 这很有趣,但它没有说明使用 SLSB 相对于托管 bean 的优势。
  • SLSB 和 CDI bean 由容器管理。服务可能不同,但始终管理生命周期。
【解决方案2】:

EJB 将成为 cdi 容器提供的一组专门的服务。

所以,要解决您的问题: 默认情况下,EJB 能够完成 cdi 所不具备的某些功能:

  • 定时器
  • 具有未来支持的异步事务执行
  • 池化:对于限制和防止拒绝服务攻击很重要
  • 监控 - 所有 EJB 都通过 JMX 公开,并且可以使用 JConsole 进行监控
  • 声明性“约定优于配置”事务。如果没有 EJB 3,您最终会变得相当臃肿。

所以,如果您只使用事务方面,那么 cdi+拦截器或 EJB 之间并没有太大的区别。

来源:http://www.adam-bien.com/roller/abien/entry/cdi_with_or_without_ejb

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 2016-04-14
    • 1970-01-01
    • 2014-06-23
    • 2010-12-13
    • 2010-09-13
    • 1970-01-01
    • 2013-02-22
    • 2013-08-02
    相关资源
    最近更新 更多