主题

简介 To top of page

本指南关注确定会话 Bean。在指南:会话 Bean 中提供了关于会话 Bean 的附加指南。在指南:Enterprise JavaBeans 中提供了关于 EJB 的常规指南。

确定会话 Bean To top of page

控制类通常是很好的会话 bean 候选者,因为会话 bean 被调整来提供控制逻辑(特别是当该控制逻辑涉及与客户端的对话时)。还经常将会话 bean 标识为业务层中一组对象的外观(请参阅下面的会话外观模式)。另外从 J2EE 1.4 开始,可以使用无状态会话 bean 来实现 Web Service。

如果您正在使用 J2EE 1.3,标准做法是通过会话 EJB 处理所有远程客户端访问,会话 EJB 将通过本地组件接口在相同的 JVM 中操作实体 EJB。

对会话 Bean 建模 To top of page

请参阅指南:确定 Enterprise JavaBeans(EJB)

有状态与无状态 到页首

有两种类型的会话 bean:有状态的和无状态的。确定会话 bean 的一部分工作是定义其职责 - 其职责之一可能就是维护调用之间的客户端状态。

有状态会话 bean 保存关于客户端和 EJB 容器之间的对话的状态信息。有状态会话 bean 实例仅在客户端对话期间存在。有状态会话 bean 通常对该客户端使用此数据来执行服务。有状态会话 bean 提供的服务可能会协调其它业务对象(会话 bean 和实体 bean)的交互。例如,可以使用有状态会话 bean 实现包含购买对象的购物车,因为它保留客户端与应用程序交互时的信息。因为将有状态会话 bean 分配给特定客户端,它们比无状态会话 bean 消耗更多系统资源,以获得维持客户端状态这一优势。容器管理这些资源,通常通过“封存”(写入磁盘)有状态会话 bean,然后在需要时重新激活它们。

无状态会话 bean 不保存关于客户端和 EJB 容器之间的对话的状态信息。“无状态”实际上表示无客户端对话状态。因此,无状态会话 bean 可以包含其它类型的状态,例如任何客户端都可以使用的数据库连接。无状态会话 bean 执行不需要使用先前方法调用中的数据的常规服务,但以参数方式在当前方法调用中接收所有相关输入,或在方法调用期间从其它源获得数据(例如从实体 bean 或通过 JDBC 访问数据库)。通常在需要时从一个已就绪的池中获得并分派无状态会话 bean,以处理传入的请求。因为所有实例都是等价的,无状态会话 bean 不需要知道它们的客户端。这样可以提高性能与可伸缩性。因为可以在间断的请求之间共享实例,而不是随特定活动会话一次次“堆叠”,无状态会话 bean 更加有效。

通常,应选择最自然适合与客户端的对话的会话 bean。有策略能够强制使有状态会话 bean 改成无状态会话 bean,例如在客户端存储客户端状态并在每次调用时发回,或在每次方法调用时从数据库存储和检索客户端状态。但是由于在网络流量和数据访问中的开销,这些策略可能实际上减少了可伸缩性。

如果将创建会话 bean 以实现 Web Service,必须按 JSR 1.3 API 规范中所定义的那样使用无状态会话 bean。

指南:为 J2EE 应用程序设计状态中涵盖了设计客户端状态的不同方法。

会话外观模式 到页首

会话 bean 的一个常见用法是作为在业务层中封装对象之间的交互的外观。会话 bean 用于抽出该复杂性,为客户端提供更简单的接口。在“J2EE 模式 - 会话外观模式”([ALU01])中详细描述了该模式。

例如,提取出实体 bean 之间的逻辑并将其移至会话 bean 以最小化实体 bean 之间的耦合,这通常就是一个很好的做法。可以通过本地接口访问实体 bean,而会话 bean 外观提供对远程客户端的访问。当有几个紧密相关的实体 bean 时,此方法最有效。

Web Service 端点 到页首

如上文所述,可以使用无状态会话 bean 实现 Web Service。这样的 bean 也称为服务实施 Bean,并且需要满足以下需求:

  • 它必须有一个缺省的公共构造函数。
  • 它必须实现服务端点接口所声明的所有方法,并且其业务方法必须是公共(public)的,而不是最终(final)或静态(static)的。
  • 它必须是无状态的。
  • 类必须是公共(public)的,但不是最终(final)或抽象(abstract)的。

关于使用会话 bean 实现 Web Service 的更多信息,请参阅 EJB 2.1JSR-109 规范。

Rational Unified Process   2003.06.15