<b>为J2EE操纵程序构建分布式对象管理框架</b>[Java编程]
本文“<b>为J2EE操纵程序构建分布式对象管理框架</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
很多企业 Java™ 技术开辟人员城市构建自己的对象管理底子架构,以此改良利用程序性能.但是,关于跨多台物理机械上的分布式 JVM 运行的利用程序,传统的对象池会碰到问题.在本文中,Zhengrong Tang 将供应一个对象管理框架,这个框架可以轻松地处理分布式系统.
为了提高 Java™ 利用程序的性能,很多开辟人员城市开辟自己的对象管理办理筹划来替换默许的垃圾汇集器.一种常用的办理筹划是对象池(object pooling).成立 Java 对象是一种开销很大的操作;假如只成立对象一次并多次反复利用它们,就会削减开销.这关于服务器端利用程序特别有意义,因为普通会反复履行相同的服务器代码.关于在单一 Java 虚拟机(JVM)中运行的利用程序,这样的办理筹划普通很简单实现.但是,在多层的体系构造中,要跨多台机械和多个 JVM 管理对象实例,这会非常复杂.
在本文中,我将介绍一个在多层 J2EE 体系构造中管理 Java 对象的框架.这个框架基于 Servlet、JSP、EJB、JMS 和 Struts 技术定义的尺度接口.因此,它并不依靠于任何特定厂商的办理筹划.当不再需求对象实例时,其他很多对象管理办理筹划要求利用程序显式地释放它们;但是这个框架并非如此,它利用范围的概念自动地释放对象实例.在禁用默许的垃圾汇集器时内存泄露是一个严重的问题,这个特点会明显降低内存泄露的风险.总之,这个框架为改良分布式 J2EE 环境中的性能供应了一个实用且易用的办理筹划.
对象成立和池
Java 对象成立和垃圾汇集都是开销很大的操作.频繁的对象成立是招致 Java 利用程序性能问题的主要缘由之一.这个问题在 servlet 等服务器端程序中影响更严重.在办法中常常有很多短时间存在的本地变量,但是办法本身会被频繁地反复调用.因此,会频繁地成立对象,然后通过垃圾汇集销毁它们.这种 object churning 现象会严重侵害性能.
对象池 是这个问题的一种办理筹划.其思惟是成立一个对象调集(普通包含相同范例的对象)并把它们存储在一个池中.假如需求一个对象,就从池中获得它,而不需求重新成立它.当这个对象完成它的工作之后,它被返回给池,可供今后重新利用.对象池需求跟踪每个对象的状况,并且应当是线程安全的.可以找到很多 Java 对象池的实现,比方 Apache 的 Common Pool(拜见 参考资料).假如不考虑实现细节,对象池普通采取清单 1 所示的接口.
清单 1. 对象池 API
public Object getObject(Class clazz); public void returnObject(Object obj); |
getObject() 办法从池中获得给定类的一个实例.returnObject() 办法把这个对象释放回池中.
对象池在大大都情形下都可以提高性能.但是,它并非没有代价.首先,当不再需求对象时,开辟人员必须显式地调用 returnObject(object).这完好背离了自动垃圾汇集机制的目标,而垃圾汇集是 Java 语言的重要特点之一(大概是最重要的特点).第二,利用程序有呈现内存泄露的风险.假如不把对象显式地返回池中,对象就会一向留着.这两个问题使开辟人员不太敢采取对象池技术.
假如 Java 开辟人员可以享用对象池的性能上风,同时没必要为显式释放对象操心,那就行了.幸运的是,这在大大都服务器端 J2EE 利用程序中是可行的.本文谈论的框架会供应一个实用的办理筹划.
一个基于范围(scope)的办理筹划
我们看看一个包含 servlet、JSP 页面和 EJB 组件的服务器端利用程序.图 1 给出一种典型的计划,它利用 MVC 和 Façade 情势.
图 1. 服务器端利用程序
在收到恳求时,servlet 调用会话 bean 上的一个办法,这个办法进而调用实体 bean 上的一个办法.在会话调用返回之后,servlet 把恳求转发给 JSP 页面.在整个流程中,按照 图 1 所示的方法成立对象.差别的对象有差别的寿命.一些对象只在一个恳求的处理周期中存在;恳求完成之后,就不再需求这些对象了.其他对象的寿命大概更长:比方,它们大概在一个 HTTP 会话乃至整个利用程序范围内存在.假如标识出每个对象的范围,便可以指定在这个范围完毕时自动释放对象.比方,图中的 object1 和 object4 在恳求范围内存在.恳求完成之后,可以自动释放这两个对象.object2 在事件范围内存在.在事件终止之后,可以自动释放它.object3 在利用程序范围内存在,因此在利用程序的整个生命周期内都存活.
为了实现这种效果,要办理两个问题:首先,改正对象池,让它理解范围的概念.第二,成立一种自动告诉机制,从而在范围完毕时发出告诉.
ObjectManager API
在本文中,我将用对象管理器(object manager) 这个词表示这个框架,以便辨别于传统的对象池.与对象池一样,对象管理器也负责从池中获得对象和把对象返回池中.别的,对象管理器还理解范围的概念.清单 2 给出对象管理器的 API.
清单 2. ObjectManager API
public interface ObjectManager { /** * Retrieve an object instance of the give class from the object pool * for the given scope, identified by a scope type and a scope key. * * @param clazz the class * @param scopeType the type of the scope * @param scopeKey the key to identify the scope * * @return an object instance retrieved from the object pool */ public Object getObject(Class clazz, int scopeType, Object scopeKey); /** * Release an object back to the object pool. * * @param object the object to be released */ public void releaseObject(Object object); /** * Release all objects of the given scope, identified by a scope type * and a scope key. * @param scopeType the type of the scope that objects bound to * @param scopeKey the key to identify the scope */ public void releaseAll(int scopeType, Object scopeKey); } |
为了从对象池获得对象,需求供应一个范围范例和一个范围键.对象管理器把范围信息与获得的每个对象关联起来.在调用 releaseAll() 办法时,对象管理器可以辨认出与给定的范围相关联的对象,并把它们释放回池中.
以上是“<b>为J2EE操纵程序构建分布式对象管理框架</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |