有状态会话bean钝化和序列化 - EJB

时间:2015-03-13 07:19:19

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

以下问题引起了我的注意

1)我在某处读到:

  

钝化:有状态bean的可扩展性机会

可伸缩性在这里意味着什么?

2)无状态会话bean如何比有状态会话bean更具可伸缩性?

3)正如

  

对于钝化,有状态会话bean被序列化并且用于   激活它将被容器反序列化......

为什么我们需要序列化和反序列化,不能在没有序列化和反序列化的情况下完成(传递和激活)?序列化如何帮助容器钝化bean?

1 个答案:

答案 0 :(得分:2)

1)有状态会话bean必须在方法调用之间保持其身份和状态。如果在一段时间内没有访问过这样的bean,那么容器可以选择钝化它。这意味着它的状态以某种方式保留在JVM之外(通常使用java序列化写入磁盘文件)并恢复其资源使用(内存)。当再次访问SFSB时,容器将再次激活它(反序列化)。 因此,SFSB能够更好地扩展(更多“实例”可以适用于单个JVM,但存在相关的时间和I / O损失)

2)无状态bean只需要在单个方法调用期间存在,然后可以回收它们使用的任何资源。更常见的是,它们中的许多将被保存在池中并暂时可用于处理特定的方法调用。因为这样的无状态会话bean对可扩展性几乎没有或没有直接影响。

有状态会话bean的用途与无状态会话bean完全不同。由于可伸缩性问题,您不会选择其中一个。

3)序列化是Java用于读写任意对象状态的机制。与SFSB关联的实例变量必须是可序列化的(除了一些记录的异常)。这不仅允许SFSB被钝化/激活,而且还允许将其迁移到其他JVM实例,以支持故障转移和/或负载平衡。

关于SFSB,钝化和激活可以通过其他方式完成,但是EJB规范强制要求序列化。