1
、有状态会话Bean
和无状态会话Bean
的区别
从编写方面来说:接口没有区别,Bean
类使用Stateless
和Statefull
。
从客户端来说:没有任何区别。
从容器方面来说:对于无状态会话Bean
来说,当有客户端发送请求的时候,不一定创建实例,所以多个客户端可能共享实例,实例的成员变量保存的信息不是专门为某个客户保存的,这些信息是所有客户端共享的,有点类似于Java
的静态成员。客户端不能期望服务器端为你保存信息。处理过程需要的信息通过方法的参数传递。如果是有状态会话Bean
,服务器会为每个客户端创建独立实例(要保存信息),每个客户端的信息由相应的实例来保存,客户端的多次方法调用(initialize
、addbook
、removebook
)之间可以共享信息,每次方法调用只需要传递额外的信息。
2
、实例池的应用
通过实例的共享,减少实例的创建和释放所花费的时间,从而提高性能,因为作为企业级一应用,创建和释放的次数会非常多。
服务器可以提前创建若干Bean
的实例,当有客户端访问的时候,可以快速的为客户端分配一个实例,用完之后再放回。
对于无状态会话Bean
来说,当请求发生的时候,可以从实例池中任意挑选一个实例。
对于有状态会话Bean
来说:
如果是新的请求
如果有空闲实例(没有与客户端关联),从实例池中挑选空闲实例;
如果没有空闲实例,查找与客户端(假设为C2
)关联了但是没有使用的实例,首先为C2
保存状态信息(挂起C2
或者钝化C2
);
如果没有空闲实例,也没有可以挂起的客户端,则等待.
如果不是新的请求(可以认为是第二次或者之后的方法调用)
首先查找与它关联的实例是否存在,如果在,直接调用方法;
如果关联的实例已经不可用,查找空闲实例使用,并且使用服务器为当前客户保存的信息来初始化这个实例(激活);
如果没有空闲实例可用,先挂起另外一个客户,然后再激活当前客户。
如果没有空闲实例,也没有可以挂起的客户端,则等待.