Jakarta ee 有状态bean是由容器管理还是由EJB中的应用程序管理?

Jakarta ee 有状态bean是由容器管理还是由EJB中的应用程序管理?,jakarta-ee,ejb,stateful-session-bean,Jakarta Ee,Ejb,Stateful Session Bean,这是我最近读到的一篇文章中的一段 此行为与有状态会话bean的行为非常不同。客户端需要通过调用带有@Remove注释的方法来显式删除有状态会话bean实例。它不会被容器自动销毁;它不受任何上下文的约束。如果将有状态会话bean与HttpSession相关联,那么还必须关心它在HttpSession结束或超时时的可靠销毁 根据这一点,应用程序有责任在使用它时删除有状态会话 但是我在几本书中读到过,如果未调用@Remove,容器仍将从范围中删除bean,但这是由容器自行决定的 所以我想知道什么是正确

这是我最近读到的一篇文章中的一段

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

根据这一点,应用程序有责任在使用它时删除有状态会话

但是我在几本书中读到过,如果未调用
@Remove
,容器仍将从范围中删除bean,但这是由容器自行决定的

所以我想知道什么是正确的?是否应显式删除
@stateful
,或者如果容器执行了删除操作,则将其留给容器进行删除

编辑

我引用Antonio Goncalves的《Java EE7入门》——一本优秀的书;pdf格式第243页

注意可选的@javax.ejb.StatefulTimeout和@javax.ejb.Remove注释@Remove修饰checkout()方法。这会导致在调用checkout()方法后,bean实例从内存中永久删除@StatefulTimeout分配一个超时值,这是允许bean在被容器删除之前保持空闲(不接收任何客户端调用)的持续时间。此注释的时间单位是java.util.concurrent.TimeUnit,因此可以从天、小时。。。到纳秒(默认值) 是(分钟)。或者,您可以避免这些注释,并依靠容器自动删除
客户端会话结束或过期时的实例。但是,确保在适当的时候删除有状态bean可能会减少内存消耗。这在高度并发的应用程序中可能非常关键。

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


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

我这样理解您所读到的内容:“如果你不自己管理SFSB,它们将积累、浪费内存,并造成容器最终试图清理的混乱……”@jahroy:我引用了《你读到了什么》一书中的文字,注意你的链接正在比较使用CDI与手动将SFSB与HttpSession关联(解释CDI在JEE6中的工作原理)在您引用的文本上方还提到了SFSB:“容器在注入过程中创建了一个有状态bean。销毁是由客户机通过调用带有Remove注释或特定于容器的超时注释的业务方法来启动的。”因此,这涵盖了两种情况:客户机手动删除SFSB,容器自行删除SFSB(在超时后,或者可能在需要资源时)…换句话说,如果你想减少内存消耗,就自己管理SFSB。否则就让容器来做吧。看起来两个来源都在说同样的话。