J2EE 探索: 有状态网络的 J2EE 技术选择合适解决方案的最佳实践 |
级别: 初级
Kyle Gabhart
, 高级顾问, LearningPatterns
2003 年 5 月 12 日 J2EE 中的 Java servlet 和 Enterprise JavaBeans 组件都提供了有状态服务器端处理。两种技术各有千秋,每种技术都比其它技术更加适合于某些应用程序设置。为了帮助您为您的企业选择合适的解决方案,LearningPatterns 的高级顾问 Kyle Gabhart 比较了这两种技术,并评估了它们在一些常见的有状态应用程序方案中的性能。<!----><!----><!----> 在 J2EE 探索 系列的 第一部分 中,我们首先研究了 J2EE 中状态管理的最新技术。上个月,我们讨论了 J2EE 中管理无状态网络的最佳选项;这个月我们将讨论管理有状态网络的技术。 首先我将简要介绍有状态应用程序管理,然后谈论不同的解决方案如何应用于 Web 层或业务层。接下来,我将比较 J2EE 中有状态应用程序管理技术的优缺点。就象在前一部分中一样,我们将通过研究每种技术最常用的一些实现,以及用于为您的企业选择合适解决方案的一些最佳实践来结束本文。 请注意,对于本文而言,JSP(Java ServerPages)文件被认为是专用类型的 servlet。 您可能会回想起来,在上一篇文章中,Web 应用程序协议被分成两大类别: 无状态(stateless) 和 有状态(stateful) ,协议的 状态 指的是它“记忆”从一个传输到下一个传输的信息的能力。因为有状态连通性是大多数企业应用程序的基本需求之一,并且因为 Web 应用程序依赖于 HTTP(内在的无状态协议),所以聪明的开发人员已经找到了许多技巧来在 HTTP 上模拟有状态连接。有状态信息可以存储在 HTML 表单字段中、附加到超链接或者存储在客户机端的 cookie 中。
客户机和服务器之间的有状态交互可以在 Web 层或业务层上进行管理。要在 Web 层上管理状态,我们使用与
Servlet 体系结构的
因此,
由 Servlet 体系结构创建的轻量级线程模型决不会因为 servlet 或 JSP 文件创建、读取或修改
J2EE 为在业务层上处理状态提供了内置的支持。与无状态会话 bean 一样,有状态会话 bean 也被映射到业务过程。两者之间的关键区别是:无状态 bean 及其数据在单个客户机请求的生命周期内存活,而有状态 bean 却维护与客户机的对话并且它们的数据跨多个请求持续存在。与 servlet 不同,有状态会话 bean 不需要任何特殊的对象,也不需要使用额外的接口来创建有状态连接。EJB 容器提供了所有有状态会话 bean 管理。对于 bean 而言,所有必要的工作就是在其部署描述符中将其声明为
正如以前阐述的,会话 bean 是最轻量级类型的企业 bean 类型。特别地,无状态会话 bean 可以方便地被容器合用,因为它们只需要维护每个请求的状态。 相反,有状态会话 bean 与容器资源并不那样友好。有状态会话 bean 的池不能象无状态 EJB 组件的池那样用来容纳任何客户机请求。有状态 bean 只能处理来自一个客户机的请求,直到该客户机释放其对那个特殊 bean 实例的控制。有状态会话 bean 消耗了容器的大量时间和内存。为了保存客户机调用之间的 bean 状态,容器必须将 bean 实例保存在活动内存中,或者临时将状态写到持久性存储(如文件系统或数据库)中。将状态分配到持久性存储中就是所谓的 钝化(passivation) 。当以前钝化的企业 bean 被再次请求时,容器通过从池中检索 bean,并且利用钝化前 bean 的持久性状态对它进行初始化,来激活它。下图阐明了有状态会话 bean 的钝化和激活: 图 1. 有状态会话 bean 的钝化/激活
决定将 bean 保存在内存中还是对它进行钝化,然后再激活它,这取决于各个供应商。尽管在释放容器资源方面钝化机制非常有帮助,但是在防止服务器崩溃以避免丢失有状态会话 bean 的活动状态方面却无能为力。尽管一些供应商提供了会话恢复功能以解决这个问题,但它不是标准的,因此依赖该功能会降低应用程序的可移植性。但是,别担心!EJB 规范确实定义了一个接口(
从性能的角度看,servlet 和无状态会话 bean 是相当具有竞争力的技术。它们都可以使用实例池为来自客户机的请求提供服务。但是,当您添加了应用程序状态管理时,巨大的性能差异就将显现。与可用作 Servlet 体系结构一部分的轻量级
与无状态的 J2EE 体系结构不同,J2EE 应用程序不提供典型的配置来充当指南或蓝图。管理状态时,合适的体系结构取决于下列因素:
尽管上述一些问题似乎明显地倾向于其中一种技术,但是许多有状态方案实际上既需要使用 servlet 又需要使用 EJB 组件。至关重要的决定就是确定是在 Web 层还是在业务层上管理状态,或者同时在两个层上管理状态。在下一节中,我们将研究一些可能的企业应用程序方案,及其最适宜的解决方案。 标准的应用程序客户机是与另一个系统或组件相互操作的客户机。我们将研究三种典型的应用程序客户机方案,并且讨论每个客户机最适合的有状态解决方案:
正如我们 上个月 讨论的,无状态会话 bean 是为电子商务随需应变(e-business on demand)应用程序精心设计的。它们是非常轻量级的,可以轻松地汇聚为池,以确保卓越的可伸缩性。相反,有状态会话 bean 并不是为这类应用程序而精心设计的。电子商务随需应变应用程序中通常需要状态管理,但是最好由专用的机制或通过 J2EE 事务进行处理。另一种可能性是调用 EJB 组件,就好象它是 CORBA 组件一样。当一个或多个被集成的应用程序是 CORBA 组件时,该选项特别有用。 有三种基本的“富”GUI(不是 HTML,也不是命令行)客户机类型:Java applet、独立应用程序和 Java Web Start。下列解决方案适用于这三种“富”GUI 组件类型中的任何一种:
如果您正在使用本机 GUI 客户机,并且需要管理复杂的事务或事务系列,那么您应该再次考虑调用 EJB 组件,就象它是 CORBA 组件一样。如果不能那样做,您可以始终让客户机通过 HTTP 与 servlet 通信,并且相应地管理会话。 在标准的、基于 Web 的应用程序情形中,客户机位于防火墙的哪一侧并不重要;使用 servlet 是必需的。因为您将使用 HTTP 作为传输协议,所以将在 Web 层上工作。唯一实际的决定 ― 是否在幕后使用 EJB 组件 ― 将取决于对 EJB 容器服务的相关需求。首先,您将选择通用的组件类型(如 servlet 和会话 bean)。接下来,您将选择一些匹配应用程序的用户界面显示和业务请求处理需求的更特定类型(如 JSP 页面和有状态会话 bean)。就所关心的状态管理而言,Web 应用程序中存在着和其它客户机类型中类似的问题。一些标准问题(和答案)将有助于您为您的 Web 应用程序确定合适的状态管理解决方案:
最后的情形需要客户机类型的组合,例如基于 Web 的浏览器和标准的“富”GUI 桌面。在这种情形下,有状态选项同无状态选项没有区别。请参考 本系列的第一篇文章 以获取详细信息。
在本部分( J2EE Pathfinder 系列的第二部分)中,我们探讨了使用 Java servlet 和有状态会话 bean 来执行客户机请求和提供有状态体验的相对优缺点。本文讨论的方案并未包含所有情形,但是它们代表了有状态通信环境中的 servlet 和会话 EJB 组件的一些最常见用法。 在下一部分中,我们将开始有关持久数据管理的两部分探讨,首先将比较实体 bean 和 JDBC。愿我们到时“探索”愉快!
|