【问题标题】:Why EJB stateless session bean must not implement SessionSynchronization?为什么 EJB 无状态会话 bean 一定不能实现 SessionSynchronization?
【发布时间】:2016-04-11 06:41:06
【问题描述】:

我说的正是 EJB 3.1,而且我知道根据规范,无状态会话 bean 不能实现 SessionSynchronization 接口,但有人可以向我解释为什么吗?因此,我不是在寻求解决方法,而是想知道这种限制背后的原因。

更新:

我不认为这与事务边界有关,因为容器应该在业务方法完成时提交,根据第 13.6.2.2 节:

当业务发生时容器尝试提交事务 方法完成。容器执行提交协议 在方法结果发送给客户端之前。

根据The Java EE 6 Tutorial:

通常,容器在一个事务之前立即开始一个事务 企业 bean 方法在之前启动并提交事务 该方法退出。每个方法都可以关联一个 交易。一个内不允许嵌套或多个事务 方法。

【问题讨论】:

    标签: java jakarta-ee transactions ejb stateless-session-bean


    【解决方案1】:

    问题与交易主题有关。因为无状态会话 bean (SLSB) 不会在后续请求之间保持会话状态,所以资源状态的任何更改(例如数据库更新)在方法的上下文中都是本地的。事务不能跨越 SLSB 的多个方法。
    关于有状态会话 bean 的情况 (SFSB) 有点不同。这对于在方法结束之前完成事务不是强制性的。因此事务可以跨越多个方法。
    当您让容器管理事务 (CMT) 并使用 SFSB 时,您可能无法准确知道事务何时开始/完成。您需要一种机制来通知这些操作何时发生。这就是SessionSynchronization接口实现的目的。
    具有 CMT 的 SLBS 不会收到事务开始/结束通知,因为事务边界是已知的并且它们仅限于业务方法执行。

    【讨论】:

    • 谢谢,但这不是规范所说的,你能告诉我规范中的“在方法结束之前完成交易不是强制性的”吗?
    • 我不能按字面意思告诉你,因为这些话是我的。但是请看一下:“在有状态会话 bean 的情况下,启动事务的业务方法可能在没有提交或回滚事务的情况下完成”这是来自 EJB 3.1 规范的第 13.6.1 章。还请看第 4.6 章中的图表。和“方法在 TX 中准备就绪”块。
    • 您提到的规范部分是关于 Bean-Managed Transaction Demarcation,这不是我们的情况,因为您无法从 BMT 实现 SessionSynchronization。这里我们说的是 CMT 的
    • 但该图同时涉及 CMT 和 BMT。
    • 图表上的内容与此无关!我看不出您如何从该图中确定事务边界
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2016-04-14
    相关资源
    最近更新 更多