技术开发 频道

EJB 编程模型

        Bean 风格

  EJB 组件分为两种主要类别 -- 会话 bean和 实体 bean。根据 bean 处理状态、事务和持久性的方式这些类别还可以进一步细分。会话 bean 通常具有以下属性:

  代表单个客户机执行

  可以是事务性的

  可以更新共享数据库中的数据

  生存期相对较短

  其生存期通常就是客户机的生存期

  任何持久性数据都由 bean 管理

  可以依容器的判断予以删除

  会在 EJB 服务器失败时被删除

  实体 bean 通常具有以下属性:

  代表数据库中的数据

  是事务性的

  允许多个用户共同访问

  可以长期存在

  持久性数据可以由容器管理

  在 EJB 服务器失败后能继续生存

  EJB 规范对会话 bean 和实体 bean 的说明如下:

  “对于客户机,会话 enterprise bean是一种非持久性的对象,它实现某些在服务器上运行的业务逻辑。想像一个会话对象的一种方式是:会话对象是运行在服务器上的客户机程序的逻辑扩展。会话对象不在多台客户机之间共享。

  “对于客户机,实体 enterprise bean是一种持久性对象,它代表一个存储在持久性存储器(例如,一个数据库)中的实体的对象视图,或者是一个由现有企业应用程序实现的实体。”( Enterprise JavaBeans Specification 1.0)

  用一种粗略的说法, 会话 bean 代表这样的操作,它检索或存储数据以满足用户请求;而实体 bean 则代表一种数据集,可以访问这些数据集来满足用户请求。

  会话 bean

  最简单的一种 Enterprise JavaBeans 组件就是 无状态的会话 bean。因为这些 bean 没有可以区分它们的状态,所有的实例都是完全相同的。容器管理无状态会话 bean 的生存周期,其方式是通过创建足够数目的此种 bean 来适应客户机工作负荷,并在不需要它们时将其删除。 钝化,即将闲置的 bean 写到磁盘上,不用于无状态的会话。要调用 bean,客户机程序调用本地接口中的 standard create() 方法,尽管此操作不一定导致实例化新的 bean 实例。容器可以选择将客户机请求发送给现有的对象。反之,容器则可以按它的选择创建新的实例,且独立于由客户机发布的 create() 方法。

  在 EJB 本地对象上发布的 create() 调用返回一个对 EJB 对象的引用,这个 EJB 对象代表 enterprise bean。一旦客户机有了 EJB 对象引用,它就可以将业务方法发布到 EJB 对象上,容器随之会将这些方法委托给 bean 自身。 负责管理会话 bean 的容器组件无需推断会话 bean 是否是无状态的。会话 bean 是无状态的还是有状态的在安装时声明。

  如果会话 bean 在方法调用之间保留状态信息,则它是 有状态的。通过调用 ejbPassivate() 方法,容器可以依其判断将有状态会话 bean 钝化,或写到辅助存储器中。EJB 规范并不要求容器在钝化 bean 时使用 Java 串行化协议,但是它们必须提供等价的功能。当容器决定将一个非活动的会话 bean 交换回到内存中时,它会取消被动 bean 的串行化,并调用 ejbActivate() 方法。有状态会话 bean 的开发人员负责确保状态数据是可串行化的。在集群的应用程序服务器环境中实现有状态会话 bean 时务必要小心,因为并不是所有的服务器都支持集群的有状态会话 bean 的同步化。

  有状态会话 bean 可以是事务性的。通过使用 javax.transaction.UserTransaction 接口中的方法,如 begin() 、 commit() 和 rollback() ,bean 可以控制事务;通过实现 javax.ejb.SessionSynchronization 接口,bean 可以接收有关事务状态的通知。EJB 容器无需推断哪些 bean 需要事务支持; UserTransaction 接口仅可用于那些在安装时被标记为事务性的 bean。

  实体 bean

  实体 bean 在体系结构上与会话 bean 类似,但它们提供对企业数据的访问,而不是支持用户会话。一个实体 bean 可以支持多个并发用户,而容器则使访问和事务同步化。实体 bean 还具有支持本地对象中的 finder 方法的主键。知道实体 bean 的主键的客户机可以通过调用本地对象上的 findBy PrimaryKey() 方法获得对象引用。与会话 bean 不同,实体 bean 的本地对象除了具有 create 方法外还具有 finder 方法。

  持久性是实体 bean 的一个基本属性。EJB 规范允许两种形式的实体持久性:bean 管理的持久性和容器管理的持久性。对于代表关系数据库中的数据的实体 bean,bean 对持久性的管理意味着,对数据库访问的调用是直接编写在企业 bean 的方法中的(使用 JDBC 或 SQLJ)。这种方法是直截了当的,但它降低了可移植性。容器对持久性的管理意味着 bean 不受数据库调用的影响。在安装时告知容器有关 bean 数据所需的持久性,而容器负责生成实现持久性的代码。这种方法允许 bean 的可移植性更高,甚至达到持久性可使用不同数据源的程度。然而,此方法要求容器中要有复杂功能。

  当实体 bean 对象与 EJB 对象相关联时,前者处于 就绪状态;否则将认为它们处于 共享状态。当客户机调用 EJB 对象中的方法时,容器查找关联的实体 bean 的实例(如果存在的话),或者从共享状态中传送出一个实例。处于就绪状态的实体 bean 可以接收到通过委托从客户机传播给它们的业务方法调用。它们还可以在容器请求时执行 ejbLoad() 和 ejbStore() 方法。load 方法和 store 方法旨在维持实体 bean 和基础数据存储之间数据的一致性。

  实体 bean 支持多个用户并发地访问数据。EJB 规范声明,维持数据完整性是容器的责任:

  “enterprise bean开发人员在编写业务方法时无需担心来自多个事务的并发访问。enterprise bean 开发人员在编写方法时可以假定,对于被多个事务同时访问的各个实体bean,将能确保适当的同步化。”( Enterprise JavaBeans Specification 1.0)

  容器完成这一任务通常是通过锁定数据库中的数据,并使访问串行化,或通过创建实体 bean 的多个实例,并允许在基础数据存储中使用并发控制,这样来管理访问。

0
相关文章