EJB3.0读书笔记 之 会话Bean介绍(一)

来源:互联网 发布:mac上好用的作图软件 编辑:程序博客网 时间:2024/04/30 02:22

1 生命周期:从客户视图看待,Bean实例开始于客户获得其引用时,而终止于客户会话的中介。通常,客户会话(Client Session)的持续期决定了使用中的会话Bean的存活期。会话Bean仅仅是内存对象,一旦其生存的周边环境遭到破坏,会话Bean也将不复存在。会话Bean并不是持久化的。实体Bean是持久化对象,是永久性存储源的组成部分。

2 会话Bean的子类型:无状态会话Bean和有状态会话Bean。

(1) 无状态会话Bean

           该Bean服务的业务过程只需要单个业务方法即可完成。因为不需要维护客户多个方法调用间的会话状态,因此是无状态的。

           无状态指的是不存在会话状态。无状态会话Bean能够含有同特定客户不相关的状态信息。无状态会话Bean不保留历史会话信息。

(2)有状态会话Bean

           该Bean服务的业务过程能够延伸到多个方法请求或者事物中。有状态会话Bean需要为单个客户保存状态信息。如果在方法调用期间有状态会话Bean的状态发生改变,则这种改变必须反映到同一客户的随后调用中。

3 有状态会话Bean的不同点

(1)实现实例池功能

          为了限制内存中运行的有状态会话Bean实例的数量,EJB容器需要将有状态会话Bean的会话状态保存到硬盘或其他存储源中,该过程称之为挂起。

          一旦被挂起的有状态会话Bean实例的客户再次调用它,被挂起的会话状态将重新回到有状态会话Bean实例中,该过程称之为激活。

          大部分容器使用最近最少使用(Least Recently Used,LRU)挂起策略,即简单地挂起最近没有使用到的有状态会话Bean实例。但是,凡是参与到事务中的有状态会话Bean实例,EJB容器必须在事务完成后才能够挂起Bean实例。

          激活有状态会话Bean实例,大部分EJB容器通常都会使用just-in-time算法,即只有在客户请求到来时,才会激活有状态会话Bean实例。如果客户请求传入到EJB容器中,而且容器已经挂起了该客户的会话状态,则容器会马上激活它,从而将挂起的状态信息写入到内存中。

(2)维护会话状态的规则

          在挂起有状态会话Bean实例时,EJB容器借助于对象序列化将会话状态转换成二进制blob,然后写入到硬盘。在转移会话状态信息后,有状态会话Bean实例(指挂起了会话状态的那些EJB实例)还能够服务于其他客户,即同新的客户进行新的会话过程。

          激活过程:将写入到硬盘的序列化blob读入到内存中,然后转换成有状态会话Bean实例的会话状态信息。

          EJB组件中的成员变量符合如下条件,则可以认为它是会话状态的组成部分之一:

                    <1>成员变量是非transient类型的Java原始类型(primitive)。

                    <2>成员变量是非transient类型的Java对象类型(继承于java.lang.Object)。

         Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,不用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。Transient是用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然后非transient型的变量是被包括进去的。

        在完成挂起和激活操作时,EJB容器必须保存如下几方面的信息:

                   <1>本地或远程业务接口引用

                   <2>针对SessionContext对象、UserTransaction、EntityManager或EntityManagerFactory对象、Timer对象的引用

                   <3>JNDI命名上下文







原创粉丝点击