【发布时间】:2014-10-14 03:01:41
【问题描述】:
这是我最近读到的oracle blog 中的一段。
这种行为与有状态会话 bean 的行为非常不同。有状态会话 bean 实例需要由客户端通过调用带有 @Remove 注释的方法来显式删除。不会被容器自动销毁;它不受任何上下文的约束。如果将 Stateful session bean 与 HttpSession 相关联,则还必须关心它在 HttpSession 结束或超时时的可靠销毁。
据此,应用程序有责任在使用完毕时删除stateful session。
但是我读过几本书,如果@Remove 没有被调用,容器仍然会从作用域中删除bean,但由它自己决定。
所以我想知道什么是正确的? @stateful 是否应该被显式删除或将其留给容器进行删除(如果它确实进行了删除)
编辑
我引用Beginning Java EE7 by Antonio Goncalves - 一本好书; pdf格式的第243页
注意可选的@javax.ejb.StatefulTimeout 和@javax.ejb.Remove 注释。 @Remove 装饰 checkout() 方法。这会导致 bean 实例在您调用 checkout() 方法后从内存中永久删除。 @StatefulTimeout 分配一个超时值,这是允许 bean 在被容器移除之前保持空闲(不接收任何客户端调用)的持续时间。这个注解的时间单位是一个java.util.concurrent.TimeUnit,所以它可以从DAYS,HOURS ...到NANOSECONDS(默认 分钟)。或者,您可以避免这些注释并依赖容器自动删除 客户端会话结束或过期的实例。但是,确保在适当的时候删除有状态 bean 可能会减少内存消耗。这在高度并发的应用程序中可能至关重要。
【问题讨论】:
-
我将您读到的内容解读为:“如果您自己不管理 SFSB,它们会累积、浪费内存并弄得一团糟,最终容器会尝试清理起来..."
-
@jahroy:我引用了书中的文字
-
"你读过的内容"
-
请注意,您的链接正在比较使用 CDI 与手动将 SFSB 与 HttpSession 关联(以解释 CDI 在 JEE6 中的工作原理)。它还在您引用的文本上方提到了 SFSB:“容器在注入期间创建了一个有状态的 bean。销毁是由客户端通过调用带有 Remove 注释或注释的业务方法来启动的。特定于容器的超时。”因此这涵盖了两种情况:客户端手动删除 SFSB 和容器自行决定删除它(超时后或可能需要资源时)。
-
... 换句话说,如果您想减少内存消耗,请自行管理 SFSB。否则让容器去做。似乎两个消息来源都在说同样的话。
标签: jakarta-ee ejb stateful-session-bean