1

这是我最近阅读的Oracle 博客中的一段。

这种行为与有状态会话 bean 的行为非常不同。有状态会话 bean 实例需要由客户端通过调用带有 @Remove 注释的方法来显式删除。不会被容器自动销毁;它不受任何上下文的约束。如果您将有状态会话 bean 与 HttpSession 关联,您还必须关心它在 HttpSession 结束或超时时的可靠销毁。

据此,应用程序有责任stateful session在完成使用时删除它。

但是我读过几本书,如果@Remove没有被调用,容器仍然会从作用域中删除 bean,但由它自己决定。

所以我想知道什么是正确的?是否@stateful应该明确删除或将其留给容器进行删除,如果它确实进行了删除

编辑

我引用自Beginning Java EE7 by Antonio Goncalves-一本优秀的书;第 243 页 pdf

注意可选的@javax.ejb.StatefulTimeout 和@javax.ejb.Remove 注释。@Remove 装饰 checkout() 方法。这会导致 bean 实例在您调用 checkout() 方法后从内存中永久删除。@StatefulTimeout 分配一个超时值,这是允许 bean 在被容器移除之前保持空闲(不接收任何客户端调用)的持续时间。这个注解的时间单位是 java.util.concurrent.TimeUnit,所以它可以从 DAYS、HOURS ... 到 NANOSECONDS(默认是 MINUTES)。或者,您可以避免这些注释,并依靠容器在客户端会话结束或到期时自动删除实例。但是,确保在适当的时候删除有状态 bean 可能会减少内存消耗。

4

1 回答 1

2

它类似于 FileInputStream。是的,FileInputStream 碰巧有一个终结器,如果你不这样做,它会自动关闭它,但预期的编程模型是你将在完成后显式关闭它,这样你就不会泄漏文件描述符。

有状态会话 bean 也是如此。是的,如果您没有显式删除它们,EJB 容器碰巧会在访问超时后清理实例(甚至存在一个标准选项来防止容器过早执行此操作),但预期的编程模型是您将显式删除它们完成后删除它们,以便有状态 bean 实例消耗的资源可以返回给系统。

于 2014-10-14T04:40:10.573 回答