EJB中的容器或应用程序管理有状态bean吗?

时间:2014-10-14 03:01:42

标签: java-ee ejb stateful-session-bean

以下是我最近阅读的oracle blog段落。

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

根据这一点,应用程序有责任在使用它时删除stateful session

但是我已经阅读了几本书,如果没有调用@Remove,容器仍然会从范围中删除bean,但由其自行决定。

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

修改

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

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

1 个答案:

答案 0 :(得分:2)

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

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