【问题标题】:Local stateless EJBs vs Remote本地无状态 EJB 与远程
【发布时间】:2015-07-31 16:23:36
【问题描述】:

我是 EJB 的新手,但我已经获得了 EJB 层来改进。
这一层由一个 EJB 组成,它公开了可用的操作:

@Stateless(name = "myejb")
public class Facade implements FacadeRemote
{
    @EJB
    private EntityAHomeLocal entityAHome;

    @EJB
    private EntityBHomeLocal entityBHome;

// methods signatures and implementations
}

如您所见,此 EJB 使用其他本地 EJB 来管理实体上的操作。

@Stateless
public class EntityAHome implements EntityAHomeLocal
{
    @PersistenceContext(name="myUnit")
    private EntityManager manager;


    // methods signatures and implementations
}

我很难完全理解这一层的架构。

  • 这种架构常见吗?
  • 本地无状态 EJB 是否像远程无状态 EJB 一样通过实例池进行管理?
  • 即使 entityAHome 和 entityBHome 是远程 EJB,它仍然可以工作吗?

【问题讨论】:

    标签: java jakarta-ee jpa ejb layer


    【解决方案1】:

    严格来说,规范只说无状态 bean “通常”是池化的(第 4.3.10.2 节),因此本地 bean 的行为是特定于供应商的,但实际上我相信所有主要供应商都这样做(for example) .

    本地和远程接口几乎完全可以互换,但有额外的部署限制(即它们必须在本地部署,当然),并且对本地接口的一些调用使用传递引用语义,而远程接口总是使用传递-按值 (link)。

    我看不出有任何东西会阻止该代码与远程接口一起工作,尽管我认为某些命名令人困惑 - 会话 bean (@Stateless) 与实体不同,在 EJB 术语中是“家”指的是一种工厂类,我认为这不是您的意图(?)。此外,请注意切换到 @Remote 会增加性能开销,如第二个链接所述。

    【讨论】:

    • 事务传播呢?我的意思是,如果我的一个本地 ejb 使用另一个本地 ejb 并且 nn 想要传播事务..,这是否要求 ejb 必须由同一个容器管理?
    • 我建议您查看 EJB 规范 (download.oracle.com/otndocs/jcp/ejb-3.1-pfd-oth-JSpec) 的第 13.7 节 - 这讨论了与远程客户端的分布式事务。
    • 规范对我来说有点难读,你能给我推荐一本关于这个主题的教科书吗?
    • 就我个人而言,Head First EJB 作为入门者,我已经走了很长一段路,然后是后续的规范。 (它真的非常易读,我推荐它!)但是从你提出的问题来看,我认为你会发现入门级书籍对于你的需求来说有点基本。
    • Head first ejb 是否涵盖 EJB 3.0 规范或更早的规范?
    猜你喜欢
    • 2013-09-16
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    相关资源
    最近更新 更多