如果有状态会话bean要钝化,则将其状态写入硬盘,然后释放bean实例以提供其他请求(至少这是我的理解)。当同一个客户端再次处于活动状态时,bean实例将从硬盘读取状态以重新获得状态。但是bean实例如何知道哪个客户端必须读取哪个文件以维持状态?
我是J2EE的新手,所以如果我问一个非常天真的怀疑,请原谅我。如果我需要了解任何其他主题,请指出我正确的方向。
答案 0 :(得分:13)
最好将有状态会话Bean(SfSB)可视化为非常接近普通Java类的实例。您查找(或注入)SfSB的实例,容器将为您创建一个并返回实例。然后,您可以像处理任何其他Java实例一样使用该实例。
这意味着您可以将实例存储到会话中,将其序列化为磁盘等
详细信息是您正在使用的实例实际上是实际的底层SfSB实例的代理。这不是真正的SfSB本身。
当您在bean的本地代理上进行调用时,将容器作业显示给内存中的bean。 Bean的钝化和激活是在幕后为您完成的(尽管您可以通过bean生命周期进入该过程)。
容器找到钝化的SfSB所需的任何信息都存储在您正在使用的代理中,但这对您来说是不透明的。你不用担心它。
因此,在典型的基于Web的场景中,生命周期是您获取bean实例,将其存储在Web会话中,然后像平常一样简单地使用它。如果容器决定它需要钝化你的bean以腾出空间或其他什么,它会自动为你钝化它。当您的用户返回时,您的应用程序会从Web会话中提取实例并进行调用。那时,如果bean被钝化,容器将再次自动为你激活bean。整个机制取决于容器,但对您来说是透明的。重要的是要记住,你必须坚持从容器中获取的SfSB,就像你对任何java对象一样。
最后需要注意的是,如果您允许SfSB钝化太长时间,容器会自动为您删除它。