【问题标题】:Multi-threading in EJB'sEJB 中的多线程
【发布时间】:2015-05-03 11:51:22
【问题描述】:

我正在学习EJB,到目前为止我已经读到EJB中不允许多线程,因为容器应该关心线程安全,让开发人员只关注业务逻辑,所以基本上意味着 EJB 确保只有一个线程可以同时访问 Session bean 中的方法。

当我们有许多用户访问 EJB 中的同一个方法时会发生什么? 容器是序列化访问,还是创建不同的 bean 实例,每个线程一个?

谁能解释一下这方面的政策是什么?我也有点困惑,为什么如果不允许多线程,所以我们不能创建自己的线程,为什么我们有这个@Asynchronous注解?

【问题讨论】:

    标签: java multithreading ejb-3.0


    【解决方案1】:

    是的,它创建了几个实例,并将它们汇集在一起​​。见official Oracle documentation

    因为无状态会话 bean 永远不会被钝化,所以它的生命周期只有两个阶段:不存在和准备好调用业务方法。图 22-4 说明了无状态会话 bean 的各个阶段。

    EJB 容器通常创建和维护一个无状态会话 bean 池,开始无状态会话 bean 的生命周期。容器执行任何依赖注入,然后调用注解 @PostConstruct 的方法(如果存在)。 bean 现在已准备好让客户端调用其业务方法。

    在生命周期结束时,EJB 容器调用注解为 @PreDestroy 的方法(如果存在)。然后 bean 的实例就可以进行垃圾回收了。

    【讨论】:

    • 快速提问,同步是在方法级别还是类级别完成的?如果我很好理解,如果两个用户试图访问同一个 EJB 实例中的同一个方法,EJB 容器会创建另一个 EJB 实例来在不同的实例中执行同一个方法,如果方法不一样会怎样?还是会创建另一个实例?
    • 这是在实例级别完成的。无论方法是什么,容器都不允许两个线程同时调用给定的 bean 实例。它通常不会创建新实例。它从池中得到一个。
    • 问个问题,你知道这个ejb池的初始大小是多少吗?我的意思是最初 EJB 容器创建了一个包含两个、三个......的池,有多少个实例?而且我猜一旦池的所有实例都被使用,它会在需要时创建新实例,对吧?
    • 这取决于应用服务器。你必须深入研究它的文档。
    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多