一、什么是会话Bean(Session)?
会话Bean:
(1) 会话Bean是EJB中一种用来建模、业务逻辑/业务流程的EJB类型。
(2) 会话Bean实例的生成是客户端调用的结果。
(3) 会话Bean接受客户端的请求,并作出响应,是一个业务处理对象(控制类,OO中类的一种(边界类,实体类,控制类))
(4) 会话Bean的存活时间很短。
常用的EJB类型:SessionBean,EntityBean,MessageDrivenBean,Entity Bean,JPA。
1、SessionBean(Statless/Statfull)
无状态的SessionBean是不会保存的信息的和状态,无状态的SessionBean是可以重用的,而不是被立刻销毁
有状态的SessionBean只为一个用户来服务。
2、MDB(Message Driver Bean)消息驱动Bean,可以进行异步的编程
3、Entity Bean 访问数据库,已经被JPA(JAVA持久化API)替代。
4、JPA基于ORM方式来实现对数据库的访问
1.SessionBean:
用于对业务建模,表示过程。流程(动词)
作为门面(Facade)。
负责接受远程访问,并操作EntityBean。同步的调用。
2.EntityBean:
生命周期:持久化。过程结束后,数据仍存在。
用于对数据建模,表示名词。
SessionBean与EntityBean组成动宾关系。
争论焦点:O/R较复杂。
一般不直接接受远程访问。
3.MessageDrivenBean:
用于封装业务过程,动词。
为了完成异步调用:客户调用,消息服务器缓存指令,发送消息给客户端,消息服务器分发消息,Bean执行。
责任同SessionBean,完成异步调用。
二、SessionBean的类型:
(1) stateless Session Bean
(2) stateful Session Bean
(一)无状态SessionBean(Statless)
(1) 无状态Session Bean单个方法调用就能完成一个完整的业务流程
(2) 无状态Session是可以被重用,不能被客户端并发共享,只可以串行共享,并不保留客户端方法调用后的的状态,而是直接返回。
(3) 无状态的SessionBean是可以池化的(pooling),以优化性能,用以被多个客户共享。
无状态SessionBean的生命周期
如果实例不存在,就会调用构造方法,然后调用资源注入方法,接着会调用有@PostConstruct标注的方法,在销毁时会调用有@PerDestroy标注的方法,
然后销毁对象,如果实例存在就会从Bean实例池中取出实例并调用方法。
回调方法是基于事件机制的。
生命周期回调方法的规则
1、对于直接定义在Bean中的回调,其格式应该是public void <method()>,也就是直接写在SessionBean中。
2、对于为Bean类单独提供(单个或多个)回调监听而言。其格式是public void <method(InvocationContext context)>
java.interceptor.InvocationContext,提供了调用的上下文信息。只在SessionBean类上加上@Interceptors(Xxxx.class)制定定义了回调方法的类。
3、回调方法不能够抛出已检查异常,但可以抛运行时异常。
在创建实例并注入资源之后,会回调这个方法。
@PostConstruct
public void constructed(){}
在销毁对象时回调这个方法
@PerDestroy
public void destroy(){}
(二)有状态的SessionBean(Statful)
有状态的SessionBean只为一个客户端服务,不能共享,并且会保留方法调用后的状态。
(1) 多个方法调用才能完成一个业务处理流程;
(2) 需要保留客户端的状态
(3) 不被多个客户共享。
当有状态的SessionBean暂时不被使用时,就会被存储到缓存当中,也就是被存到虚拟内存或者是将信息同步到Session数据库中(Session数据库是应用服务器所提共的小型数据库,用来保存Session的信息,多应用服务器共享Session数据库,同步Bean的信息,达到集群处理)。
swap out passivation钝化过程,保存SessionBean的状态,在SessionBean处在事务中时是不会进行钝化的。
swap in activation激活过程,提取保存的SessionBean到内存中,可以继续被客户端使用。
有状态的Session,会保存成员变量(没有加transient关键字,以及串行化的类型和基本类型),也会保存其他的SessionBean的引用。
对有状态的SessionBean中有transient属性时,就需要在Bean中提供激活的方法也就是
@Statful
Test implements TestRemote{
transient private int a;
@PostActivate
public void activate(){
a=5;
}
}
在SessionBean中实现事务处理时要实现SessionSynchronization接口。
关于有状态会话Bean与无状态会话Bean的比较:
Stateless Session Bean
(1) EJB容器可以预先实例化多个无状态会话Bean的实例,组成一个pool;
(2) 当客户请求调用时,容器可以任选一个实例处理请求;
(3) EJB容器可以依照请求量的大小来调整pooling中实例的个数;
对于客户端来讲,这些stateless Session Bean毫无区别。
(4) EJB容器可以通过pooling来达到使用少量实例来应对大量的请求。
Stateful Session Bean
对于有状态的会话Bean,不能够同时被多个客户所共享。
如果要让stateful Session Bean能够同时服务多个客户,就要使用Swapping。
钝化:将会话Bean中客户状态钝化到存储设备(swap out)。
激活:将存储设备中的客户状态读回到会话Bean中(swap in)。
使用有状态会话Bean时如何维护客户状态?
(1) 在默认状况下,可以不用考虑,容器会自动维护客户端的状态
Tips:容器自动维护的状态
A、非transient修饰的属性
B、EJB中的其他业务接口
C、EJB中的home接口
D、EJB中的会话上下文,事务对象
E、JNDI上下文(Context)
(2) 对于一些无法采用默认的swap机制钝化、激活的状态,应该采用回调方法手动实现激活和钝化。
1、何时需要使用有状态的会话Bean?
需要跨多个方法完成某个业务处理流程,并且需要保持客户端状态。
2、有状态会话Bean能否实现pooling?
可以,但需要swping,不停地激活、钝化。
3、无状态会话Bean的pooling性能优于有状态会话Bean的pooling(swap有I/O瓶颈)。
4、无状态会话Bean可以有属性,但是属性的值被所有的客户端共享。
在厂商的部署描述中可以配置EJB的实例池,可以一次创建多个EJB的实例。
SessionBean
SessionBean接受客户端的请求,并作出响应,是商业过程处理对象。
无状态SessionBean(Statless)
无状态Session是可以被重用,不能被客户端并发共享,只可以串行共享,并不保留客户端方法调用后的的状态,而是直接返回。
无状态的SessionBean是可以池化的,以优化性能。
无状态SessionBean的生命周期
如果实例不存在,就会调用构造方法,然后调用资源注入方法,接着会调用有@PostConstruct标注的方法,在销毁时会调用有@PerDestroy标注的方法,然后销毁对象,如果实例存在就会从Bean实例池中取出实例并调用方法。
回调方法是基于事件机制的。
生命周期回调方法的规则
1,对于直接定义在Bean中的回调,其格式应该是public void <method()>,也就是直接写在SessionBean中。
2,对于为Bean类单独提供(单个或多个)回调监听而言。其格式是public void <method(InvocationContext context)>
java.interceptor.InvocationContext,提供了调用的上下文信息。只在SessionBean类上加上@Interceptors(Xxxx.class)制定定义了回调方法的类。
3,回调方法不能够抛出已检查异常,但可以抛运行时异常。
在创建实例并注入资源之后,会回调这个方法。
@PostConstruct
public void constructed(){}
在销毁对象时回调这个方法
@PerDestroy
public void destroy(){}
有状态的SessionBean(Statful)
有状态的SessionBean只为一个客户端服务,不能共享,并且会保留方法调用后的状态。
当有状态的SessionBean暂时不被使用时,就会被存储到缓存当中,也就是被存到虚拟内存或者是将信息同步到Session数据库中(Session数据库是应用服务器所提共的小型数据库,用来保存Session的信息,多应用服务器共享Session数据库,同步Bean的信息,达到集群处理)。
swap out passivation钝化过程,保存SessionBean的状态,在SessionBean处在事务中时是不会进行钝化的。
swap in activation激活过程,提取保存的SessionBean到内存中,可以继续被客户端使用。
有状态的Session,会保存成员变量(没有加transient关键字,以及串行化的类型和基本类型),也会保存其他的SessionBean的引用。
对有状态的SessionBean中有transient属性时,就需要在Bean中提供激活的方法也就是
@Statful
Test implements TestRemote{
transient private int a;
@PostActivate
public void activate(){
a=5;
}
}
在SessionBean中实现事务处理时要实现SessionSynchronization接口。
java -Dorg.omg.CORBA.ORBInitialHost=192.168.12.41