【问题标题】:Can it be important to call remove() on an EJB 3 stateless session bean? Perhaps on weblogic?在 EJB 3 无状态会话 bean 上调用 remove() 是否重要?也许在 weblogic 上?
【发布时间】:2010-05-05 15:04:54
【问题描述】:

我正在将 EJB 2 应用程序迁移到 EJB 3(删除所有这些部署描述符是多么令人满意的任务!)。它曾经在 Weblogic 上运行,现在在 Glassfish 上运行。

任务进展得非常顺利,但有一件事让我很警惕:当前代码非常注意确保在完成工作时在 bean 上调用 EJBObject.remove(),并且其他开发人员有(不幸的是非常模糊)记忆没有完成时会发生“坏事”。

但是,对于EJB3,实现类没有实现EJBObject,所以没有remove()方法可以调用。我的理解是,在无状态会话 bean 上调用它根本没有任何意义,因为它们是无状态的。

这些“坏事”会不会是特定于 weblogic 的?如果没有,还有什么?我应该避免完整的 EJB3 轻量级并保留扩展 EJBObject 的远程接口吗?或者干脆把它当作货物狂热的编程,并删除所有那些 try/finally 子句?

我倾向于后者,但感觉不太舒服。

【问题讨论】:

  • 有什么更新吗?在 EJB3 中,我看到客户端必须调用带有 @Remove 注释的方法。您是否还建议无状态 EJB 没有状态?他们是这样。它们是无状态的,因为它们不维护 2 个方法调用之间的会话状态(它们在方法调用期间进行)。
  • @MichaelBorgwardt 等人,由于 EJB 3 没有实现 EJBObject,容器是否将本地 bean 的直接引用返回给本地客户端?如果是这样,则存在风险,例如客户端可以将 null 值分配给相同的值,并且池实例将从 SLSB 池中消失。如果客户端调用通过 EJB 2.1 中的代理进行路由,那么这种代理类型是什么?
  • @mnmopazem:自从我使用 EJB 工作以来,我已经很长时间无法记住细节了,但我肯定会假设 EJB3 本地 bean 作为直接引用提供给客户端 - 如果你认为将 null 分配给引用可能会使实例从池中消失,您对引用的工作方式有一些误解。
  • @MichaelBorgwardt 了解参考资料很有趣。你能详细说明一下吗? IOW,如果客户端持有对 bean 的直接引用,为什么分配 null 不会将其从池中消失。通过“消失”,我的意思是它会根据运行时为 GC 做好准备。我发布了一个问题@stackoverflow.com/questions/51657404/…。我要求您在那里分享您的知识输入。
  • @mnmopazem:仅当没有其他对该对象的引用时。但是,如果您有一个从池中分配的对象,则该池也将包含对该对象的引用。否则在客户端完成后它就有资格进行 GC,将引用设置为 null 对此没有任何影响。

标签: jakarta-ee glassfish ejb-3.0 weblogic ejb


【解决方案1】:

我不熟悉 WebLogic 的实现,但我无法想象它的重要性。我希望 SLSB 包装器上的每个方法调用在方法调用之前从池中分配一个 bean 并在之后释放它,所以 remove() 没有什么可做的。

我会把它写成货物狂热的编程。作为猜测,有人曾经忘记为 SFSB 调用 remove 并发现发生了不好的事情,因此将该模式扩展到所有会话 bean。

【讨论】:

  • 我不同意拨打EJBObject.remove() 并不重要的决定。毕竟,EJBObject.remove() 是否为空操作取决于实现。例如,在 WebSphere 上,它是无操作的。问题是它从来没有真正规范过。如有疑问,请遵守规范。 (好在 EJB 3 消除了很多这种废话)
  • @Isaac:你是对的,EJB 3.1 规范的第 21.4.5.1 节明确说明了关于无状态会话 bean 的说明:“对于 EJBHome 的调用是否删除同样取决于实现(Handle) 或 EJBObject 或 EJBLocalObject remove() 方法会导致立即删除 bean 实例,具体取决于容器的实现策略。”
【解决方案2】:

没错。您没有在 EJB 3 中实现 EJBObject,这就是您不能调用 remove() 方法的原因。 EJB 3 实际上有依赖注入,它与 EntityManager 一起工作。

现在,我正在将应用程序从 EJB 2.1 迁移到 EJB 3,并且我认识到我可以通过 EntityManager 解决这个问题

@资源 私有 EntityManager em;

您可以在 remove 方法中编写 em.remove(yourObject);

希望对你有帮助

【讨论】:

  • 这个答案是无关紧要的。 EJBObject 与 EntityManager 无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多