延吉市海兰江花园位置:EJB 笔记 -Chapter03 会话Bean

来源:百度文库 编辑:偶看新闻 时间:2024/05/06 18:16:09

Chapter03 会话Bean

一、什么是会话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) statefulSession Bean

 

(一)无状态SessionBean(Statless)

  (1)无状态Session Bean单个方法调用就能完成一个完整的业务流程

(2) 无状态Session是可以被重用,不能被客户端并发共享,只可以串行共享,并不保留客户端方法调用后的的状态,而是直接返回。

(3) 无状态的SessionBean是可以池化的(pooling),以优化性能,用以被多个客户共享。

 

无状态SessionBean的生命周期

 

如果实例不存在,就会调用构造方法,然后调用资源注入方法,接着会调用有@PostConstruct标注的方法,在销毁时会调用有@PerDestroy标注的方法,

然后销毁对象,如果实例存在就会从Bean实例池中取出实例并调用方法。

 

回调方法是基于事件机制的。

 

生命周期回调方法的规则

1、对于直接定义在Bean中的回调,其格式应该是publicvoid ,也就是直接写在SessionBean中。

2、对于为Bean类单独提供(单个或多个)回调监听而言。其格式是public void

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 outpassivation钝化过程,保存SessionBean的状态,在SessionBean处在事务中时是不会进行钝化的。

swap inactivation激活过程,提取保存的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的比较:

  StatelessSession Bean

  (1)EJB容器可以预先实例化多个无状态会话Bean的实例,组成一个pool;

  (2)当客户请求调用时,容器可以任选一个实例处理请求;

  (3)EJB容器可以依照请求量的大小来调整pooling中实例的个数;

     对于客户端来讲,这些stateless Session Bean毫无区别。

  (4)EJB容器可以通过pooling来达到使用少量实例来应对大量的请求。

  StatefulSession 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中的回调,其格式应该是publicvoid ,也就是直接写在SessionBean中。

2,对于为Bean类单独提供(单个或多个)回调监听而言。其格式是public void

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