J2EE探索: 有状态网络的J2EE技术 - 编程入门网
产生最小的影响。
J2EE探索: 有状态网络的J2EE技术(2)时间:2011-04-11 IBM Kyle Gabhart业务层 J2EE 为在业务层上处理状态提供了内置的支持。与无状态会话 bean 一样,有状态会话 bean 也被映射到业务过程。两者之间的关键区别是:无状态 bean 及其数据在单个客户机请 求的生命周期内存活,而有状态 bean 却维护与客户机的对话并且它们的数据跨多个请求持 续存在。与 servlet 不同,有状态会话 bean 不需要任何特殊的对象,也不需要使用额外的 接口来创建有状态连接。EJB 容器提供了所有有状态会话 bean 管理。对于 bean 而言,所 有必要的工作就是在其部署描述符中将其声明为 stateful 。 管理有状态 bean 正如以前阐述的,会话 bean 是最轻量级类型的企业 bean 类型。特别地,无状态会话 bean 可以方便地被容器合用,因为它们只需要维护每个请求的状态。 相反,有状态会话 bean 与容器资源并不那样友好。有状态会话 bean 的池不能象无状态 EJB 组件的池那样用来容纳任何客户机请求。有状态 bean 只能处理来自一个客户机的请求 ,直到该客户机释放其对那个特殊 bean 实例的控制。有状态会话 bean 消耗了容器的大量 时间和内存。为了保存客户机调用之间的 bean 状态,容器必须将 bean 实例保存在活动内 存中,或者临时将状态写到持久性存储(如文件系统或数据库)中。将状态分配到持久性存 储中就是所谓的 钝化(passivation)。当以前钝化的企业 bean 被再次请求时,容器通过 从池中检索 bean,并且利用钝化前 bean 的持久性状态对它进行初始化,来激活它。下图阐 明了有状态会话 bean 的钝化和激活: 图 1. 有状态会话 bean 的钝化/激活 决定将 bean 保存在内存中还是对它进行钝化,然后再激活它,这取决于各个供应商。尽 管在释放容器资源方面钝化机制非常有帮助,但是在防止服务器崩溃以避免丢失有状态会话 bean 的活动状态方面却无能为力。尽管一些供应商提供了会话恢复功能以解决这个问题,但 它不是标准的,因此依赖该功能会降低应用程序的可移植性。但是,别担心!EJB 规范确实 定义了一个接口( javax.ejb.SessionSynchronization ),它可以向企业 bean 警报事务 的状态,包括由于服务器崩溃而失败的事务(假定不是拔了服务器的插头)。实现 SessionSynchronization 接口的企业 bean 必须定义三个已声明的方法特征符: afterBegin() 、 beforeCompletion() 和 afterCompletion(boolean) 。这些方法使 bean 可以从容器接收三个额外的回调,以允许正确处理 bean 中的事务状态。 J2EE探索: 有状态网络的J2EE技术(3)时间:2011-04-11 IBM Kyle GabhartEJB 组件性能 从性能的角度看,servlet 和无状态会话 bean 是相当具有竞争力的技术。它们都可以使 用实例池为来自客户机的请求提供服务。但是,当您添加了应用程序状态管理时,巨大的性 能差异就将显现。与可用作 Servlet 体系结构一部分的轻量级 HTTPSession 机制不同,有 状态会话 bean 需要一个更加重量级的针对状态管理(如上面概述的钝化/激活方案)的解 决方案。这个针对有状态会话 bean 的常用解决方案需要花费服务器时间和资源来钝化 bean 状态、回收 bean 实例和激活 bean 状态。上述的每个过程都需要几次容器调用,以及需要 直接对 bean 执行回调方法,以确保正确处理 bean 的状态。总而言之,有状态会话 EJB 组 件为管理应用程序状态提供了一种重量级机制。 选择合适的技术 与无状态的 J2EE 体系结构不同,J2EE 应用程序不提供典型的配置来充当指南或蓝图。 管理状态时,合适的体系结构取决于下列因素: 客户机是基于 Web(HTTP)的吗? 对话状态需要包含到 GUI 中吗? 服务器将处于哪种负载条件下呢? 有状态组件需要能够 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |