【发布时间】: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