J2EE系统优化之对象与循环简介
- 格式:docx
- 大小:16.58 KB
- 文档页数:6
什么是J2EEJ2EE: 电子商务和信息技术的快速发展以及对它们的需求给应用程序开发人员带来了新的压力。
必须以比以前更少的金钱、更少的资源来更快地设计、开发企业应用程序。
为了降低成本,并加快企业应用程序的设计和开发, J2EE 平台提供了一个基于组件的方法,来设计、开发、装配及部署企业应用程序。
J2EE 平台提供了多层的分布式的应用模型、组件再用、一致化的安全模型以及灵活的事务控制。
您不仅可以用比以前更快的速度向市场推出创造性的客户解决方案,而且您的平台湾搞独立立的、基于组件的J2EE 解决方案不会被束缚在任何一个厂商的产品和API 上。
1. J2EE 规范定义了以下种类的组件应用客户组件。
Enterprise JavaBeans 组件。
Servlet及JavaServer Pages(JSP 页面)组件(也被称作Web 组件)。
Applet。
一个多层的分布式的应用模型意味着应用逻辑被根据功能划分成组件,并且可以在同一个服务器或不同的服务器上安装组成J2EE 应用的这些不同的组件。
一个应用组件应被安装在什么地方,取决于该应用组件属于该多层的J2EE 环境中的哪一层。
这些层是客户层、We b层、业务层及企业信息系统层( EIS )等。
(1) 客户层J2EE 应用可以是基于Web 的,也可以是不基于Web 的。
在一个基于Web 的J2EE 应用中,用户的浏览器在客户层中运行,并从一个We b服务器下载Web 层中的静态HTML 页面或由J S P或Servlet 生成的动态HTML 页面。
在一个不基于Web 的J2EE 应用程序中,一个独立客户程序不运行在一个HTML 页面中,而是运行在其他一些基于网络的系统(比如手持设备或汽车电话)中,Applet 程序,在客户层中运行,并在不经过Web 层的情况下访问Enterprise Beans。
这个不基于Web 的客户层可能也包括一个JavaBeans 类来管理用户输入,并将该输入发送到在企业层中运行的Enterprise Beans类来进行处理。
Struts的原理和优点.Struts工作原理MVC即Model—View—Controller的缩写,是一种常用的设计模式。
MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。
MVC的工作原理,如下图1所示:Struts 是MVC的一种实现,它将Servlet和JSP 标记(属于J2EE 规范)用作实现的一部分。
Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展.Struts的工作原理,视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。
控制:在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。
ActionServlet是一个通用的控制组件。
这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。
它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。
另外控制组件也负责用相应的请求参数填充Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。
动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。
最后动作类把控制权传给后续的JSP 文件,后者生成视图。
所有这些控制逻辑利用Struts-config.xml文件来配置。
模型:模型以一个或多个java bean的形式存在。
这些bean分为三类:Action Form、Action、JavaBean or EJB.Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。
Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。
J2EE的体系架构——J2EEJ2EE是Java2平台企业版(Java 2 Platform,Enterprise Edition),它的核⼼是⼀组技术规范与指南,提供基于组件的⽅式来设计、开发、组装和部署企业应⽤。
J2EE使⽤多层分布式的应⽤模型。
J2EE分层:客户层,执⾏在客户计算机上的组件,⽤户与系统的接⼝逻辑,通过http协议的来訪问应⽤server。
表⽰层,执⾏在J2EEserver上的组件,通过与业务逻辑层互动。
将⽤户须要的数据以适当的⽅式输出。
业务逻辑层,相同是执⾏在J2EEserver上的组件。
企业信息系统层(EIS),是指执⾏在EISserver上的软件系统。
以上层次⼀般也指三层应⽤,也就是客户层+J2EE应⽤服务层+企业信息系统层。
分布在三个不同位置:客户计算机、J2EEserver及后台的数据库或过去遗留下来的系统。
客户层Web浏览器也称Webclient,以标准格式来显⽰从server传递过来的⽹页,它们传递给浏览器时已经是HTML或者XML格式,浏览器正确的显⽰给⽤户。
⼩应⽤程序(Applet)是嵌在浏览器中的⼀种轻量级client。
当web页⾯不能充分的表现数据或者应⽤界⾯的时候,才使⽤它,Applet是⼀种替代web页⾯的⼿段。
可以使⽤J2SE开发Applet。
Applet⽆法使⽤J2EE中的各种Service和API。
须要执⾏在client安装了Java虚拟机的Web浏览器上。
应⽤程序clientJ2EE应⽤程序client相对Applet⽽⾔。
是⼀个较重量级的client,可以使⽤⼤多数的服务和API,它执⾏在客户机上,能提供强⼤⽽灵活易⽤的⽤户界⾯,如使⽤Swing或AWT创建的图形化的⽤户界⾯(GUI)。
当然。
应⽤程序可直接訪问执⾏在业务层的Bean,假设需求同意。
也可以打开HTTP连接,建⽴与执⾏在Web层上的Servlet之间的通讯。
J2EE应⽤server两⼤容器EJB容器+Web容器,即业务逻辑层+表⽰层Web容器管理全部的Servlet等Web组件的执⾏。
各种系统架构图及其简介(Spring+IBatis+Struts1+Struts2+Hibernate+JavaEE+Oracle)1.Spring架构图Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。
框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。
Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。
Spring的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。
这样的对象可以在不同J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。
组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
每个模块的功能如下:核心容器:核心容器提供Spring框架的基本功能。
核心容器的主要组件是BeanFactory,它是工厂模式的实现。
BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。
Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP模块直接将面向方面的编程功能集成到了Spring 框架中。
所以,可以很容易地使Spring框架管理的任何对象支持AOP。
Spring AOP模块为基于Spring的应用程序中的对象提供了事务管理服务。
通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。
异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。
循环遍历对象的方法随着程序语言,特别是 JavaScript发展,对象(Object)作为一种重要的数据结构被越来越广泛地使用。
不管是构建应用程序或是处理信息,我们都可以使用对象去存储、访问和组织数据。
但是为了处理或者调试这些对象,一种有效的方法是通过循环遍历对象的属性和值,也就是遍历对象的方法。
遍历对象的方法可以分成两类:一类是使用for循环,利用 for(in) 、 for(of)循环该对象的属性及其值,这种方法的缺点是不能控制遍历的顺序,也不能改变遍历顺序。
另一类是使用 Object.keys()方法把对象的属性转换成一个数组,然后使用 for forEach 、 for(of) 、 for(while)循环该对象的属性及其值。
这种方法的优点是可以控制遍历的顺序,也可以改变遍历顺序。
除了上面两种常用的遍历方法外,我们还可以使用以下方法来遍历对象:1)使用 Array.forEach法:Array.forEach()法可以对对象数组进行遍历,也就是把对象的属性值及其键作为参数传递给一个函数并依次执行。
2)使用 Object.keys法:Object.keys()法可以把一个对象的属性名组成一个数组,然后使用 for、forEach 、 for(of)和for(while)遍历这个数组即可实现对象的属性及其值的遍历。
3)使用 Object.entries法:Object.entries()法把对象转换成一个由键值对组成的数组,然后使用 for、forEach 、 for(of)和 for(while)遍历这个数组即可实现对象的属性及其值的遍历。
此外,我们还可以使用 lodash 中的 _.forEach法来循环遍历对象的属性及其值,这种方法的优点是可以控制遍历的顺序,也可以改变遍历顺序,另外对于对象中的特殊字段,_forEach法也可以提供更好的处理。
以上就是循环遍历对象属性及其值的几种不同方法,它们之间的不同在于对对象的操作有不同的效率,以及对不同类型的对象有不同的效果。
J2EE的层次和组成J2EE的层次和组成J2EE组件和“标准的” Java类的不同点在于:它被装配在一个J2EE应用中,具有固定的格式并遵守J2EE规范,由J2EE服务器对其进行管理。
以下是关于J2EE的层次和组成,欢迎大家参考!目前,Java 2平台有3个版本,它们是适用于小型设备和智能卡的Java 2平台Micro版(Java 2 Platform Micro Edition,J2ME)、适用于桌面系统的Java 2平台标准版(Java 2 Platform Standard Edition,J2SE)、适用于创建服务器应用程序和服务的Java 2平台企业版(Java 2 Platform Enterprise Edition,J2EE)。
J2EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。
J2EE技术的基础就是核心Java平台或Java 2平台的标准版,J2EE不仅巩固了标准版中的许多优点,例如"编写一次、随处运行"的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等,同时还提供了对EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML 技术的全面支持。
其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。
J2EE使用多层的分布式应用模型,应用逻辑按功能划分为组件,各个应用组件根据他们所在的层分布在不同的机器上。
事实上,sun 设计J2EE的初衷正是为了解决两层模式(client/server)的弊端,在传统模式中,客户端担当了过多的角色而显得臃肿,在这种模式中,第一次部署的时候比较容易,但难于升级或改进,可伸展性也不理想,而且经常基于某种专有的协议??通常是某种数据库协议。
J2EE相关技术介绍J2EE 技术介绍J2EE 概述为了解决企业在软件开发中出现的问题,SUN 公司提出的以Java 2 平台为核心一种框架方案J2EE。
它的出现精简了企业软件开发、部署过程,为企业建造高质量的应用系统提供了好的支撑,解决了传统两层模式(Client/Server)下客户端庞大的弊端。
J2EE 平台由一整套服务(Services)、应用程序接口(APIs)和协议构成,它对开发基于Web 的多层应用系统提供了强大的支持,本质上是一个分布式的服务器应用程序设计环境。
2005 年 6 月,J2EE 正式更名为Java EE。
J2EE 的四层模型J2EE 采用多层的分布式模型,J2EE 应用程序既可以是三层结构,也可以是四层结构。
典型的基于B/S 的J2EE Web 应用四层结构包括客户层、控制层、业务层和持久层,分层图如图 2.1 所示:1客户层客户层又称为用户层。
简单来理解就它主要是与客户双向互动的,既接收来客户的命令或请求又把来自系统的执行结果展示给用户。
J2EE 客户端有许多,可以是基于Web 或者不是基于Web。
通常用户层采用Web 客户端,也就是瘦客户端,显示由JSP 或Servlet 产生的Web 页面。
客户层一般不实现如数据库操作(sql)、完成复杂的业务逻辑这样的功能。
Web 客户端基于浏览器形式,维护、使用、升级方便,不需要单独再次安装客户端。
2控制层控制层又称Web 层。
它的主要作用是接收来自客户端的请求(Request),并对客户的请求产生相应的响应(Response)。
J2EE 平台中,控制层是由Web容器内的组件来实现,可以解决系统异构性问题,实现系统的通用性、可伸缩性、易维护性。
3业务层业务层或EJB 层主要是满足某些领域(教育业和金融业)特定业务需要的。
通常情况下,业务层提供业务服务组件供应用程序使用。
业务组件通常被实现EJB(Enterprise JavaBeans)组件,并由EJB 容器负责管理和执行。
第26卷第3期2006年6月 暨南大学学报(自然科学版) Journa l of Jinan Unive rsity (N atural Science ) Vol .27No .3 Jun.2006[收稿日期] 5[作者简介] 朱岸青(6),女,讲师,硕士,研究方向计算机网络通讯联系人王会进J2EE 系统的EJB 技术性能测试和优化朱岸青1, 王会进2, 高河福3(1.广西工学院计算机科学系,广西柳州545005;2.暨南大学计算机科学系,广东广州510632;3.广州联通分公司,广东广州510663)[摘 要] 对一个J2EE 架构的应用系统的EJB 设计模式及性能进行分析,建立了测试环境,运行了测试用例,总结了优化EJB 性能的几点方法和策略,包括增加会话外观、运用值对象模式、合理规划EJB 设计粒度等.[关键词] J2EE 系统; EJB 技术; 会话外观; 值对象[中图分类号] TP393.4 [文献标识码] A [文章编号] 1000-9965(2005)06-0368-06Resea r ch on per form an ce test an d opt i m i za ti on ofEJ B i n a J2EE Ba sed syste mZHU An 2qing 1, WANG Hui 2jin 2, G A O He 2fu 3(1.Depa rt m ent of Co mputer Sc ience,Guangxi Universit y of Technol ogy,Liuzhou 545005,China;2.Depa rt m ent of Co mputer Sc ience,Jinan Univ e rsit y,Guangzhou 510632,China;3.Chi na Unico m Co .Ltd .Guang zh ou B ranch,Guangzhou 510663,China )[Abstra ct] The design pattern and effic iency of EJB in one J2EE app lica tion syste m is analyzed .The envir onm ent t o te st some ac tual exa mple s is builded.S om e op ti m izati on strategies of EJB components,include adding Sessionfacade,using Value object pa tte r n,pr ogr amm ing granularity of EJB p r ope rly,a r e shown.[Key words] J2EE; EJB; Se ssion facade; Value object EJB 组件是Java 类与X ML 文件封装为一个整体的集合.EJB 不局限于一种特定的操作系统,也不局限于任何一种特别的机构、服务器解决方案、中间件或者通信协议,是一种可重用的具有高度可移植性的组件.EJB 运行在EJB 容器中,容器提供系统级的服务,包括持久化、数据缓存、声明性安全、负载均衡、错误修复及事务性处理的服务.加强EJB 的灵活性和易用性是要以牺牲某些性能为代价的.比如,B ean 实体与容器的通信是通过代理来实现的,这就不可避免地影响了其性能.但是,与其优点相比,损失一些性能是值得的.而且,只要合理地设计和使用EJB ,仍可以开发出高性能的EJB 组件[1].200-09-07197-:.:本文的J2EE 应用系统是某公司的客户服务应用系统.该公司拥有近200万的移动通信用户,为了更好地为这些用户提供优质服务,公司计划建立客户服务应用系统,以及时有效地解决用户的问询和投诉,为主动服务于用户提供系统支撑.由于该系统具有数据量大(每月产生的详单数据就有近2亿条记录)、用户数多和需求变化大的特点,所以该系统的性能及灵活性就显得特别重要.本文结合该应用系统,并在已有的若干种EJB 设计模式中进行了深入的分析和研究,并建立测试环境,通过测试用例的运行和结果分析,应用了适合该系统的几种EJB 设计模式,并提出优化EJB 的性能的几点方法和策略,为该系统的设计与实现提供了依据.由于本系统客户端大部分属于瘦客户端,而且系统主要的工作是在查询数据返回给客户端,所以影响系统性能的主要因素是在应用服务器层.在系统中,会话B ean 主要用于保存用户的会话信息及用做实体Bean 的会话外观;实体B ean 主要用于数据持久化[2-3].1 影响业务层性能的因素考察系统性能,一般包含以下两个指标:(1)响应时间[1]———从初始的请求到回应下载的完成(刷新整个网页)之间的时间.(2)负载[1]———系统使用的尺度.当服务器的应用可以承受繁重的通讯量时被称为可以承受“高负载”.在本系统中,业务层主要由一些Sessi onEJB 和EntityEJB 组成,扮演着模型的角色.这些元素部署在W EBLO GI C 的EJB 容器中,它们是整个系统的核心和关键部分,所以对整个系统的性能影响至关重要[2-3,7].1.1 为En t ityEJB 增加会话外观在多层J2EE 应用程序环境下,一般会产生以下问题:3业务对象的紧密耦合,这会导致客户端和业务对象的直接依赖关系.3客户端和服务器之间的网络方法调用太多,容易导致网络性能问题.3缺乏统一的客户访问策略,容易误用业务对象. 解决方案:会话外观模式.通过引入会话外观组件,可以有效解决上述提到的问题,明显提高系统的性能.会话外观管理着业务对象,并向客户端提供统一的粗粒度的服务访问[4].会话外观,如其名字所示,采取的是一个会话EJB 的形式.客户与会话外观通信,会话外观再根据其他EJB 如实体bean 来提供业务服务. 图 会话外观控制对多个实体的访问 图1显示了一个会话外观如何控制多个实体bean 的访问并且提供一个对客户统一的接口.一个会话外观既可以从其他会话EJB访问服务和数据,也可以从数据访问对象(Da 2ta AccessO bjects)来访问.这些类之间的关系如图所示通常,会话外观能封装一个或者多个业务使用案例通过对该会话外观的一次调用可以963第3期朱岸青,等: J2EE 系统的EJB 技术性能测试和优化 1bean 1..得到多个业务操作;可以在服务器上迭代处理数据,只把结果传送回客户.这样就减少了网络传输量,当然也给服务器处理带来了一些负担.在本系统中,大量采用了会话外观的设计模式,从而在整体上大大提高了系统的性能.1.2 值对象设计模式业务组件的一些方法可以向客户端返回数据.通常,客户端需要多次调用业务对象的GET 方法直到获得所有的属性值.对业务服务对象(会话bean 或实体bean )的每个方法调用一般都是远程的.因此,在EJB 应用程序中此类远程调用并不关心客户端与该B ean 的直接交互,而是用网络层服务,这样带来了一定的网络负载.随着远程方法使用的逐渐增加,应用程序的性能将会下降很多[6].因此,使用多个只返回单个属性值的GET 方法来从EJB 获得数据的效率会很低. 图2 客户、EJB 和值对象之间的交互图 解决方案:值对象模式. 上述问题可以通过生成一个值对象(Value Object)来解决.值对象把业务数据封装在一个普通的Java 对象中,而不是像EJB 这样的重型分布式对象.这样,如果要得到某个值,就发出一个返回值对象的请求,而不需要为EJB 的每个属性各发出一个请求.通过Java 串行化的值对象将被回送给客户,客户就在其本地地址空间中访问值对象的属性,从而减轻了许多网络上的传输负担.客户、EJB 和值对象之间的交互如图2所示.在本系统中,合理规划了很多值对象,从而大大提高了系统的性能.1.3 合理规划EJB 的粒度在EJB 的R e mote 接口中使用粗粒度的方法,尽量少使用细粒度方法,即要合理规划EJB的粒度[2,5].本系统根据业务逻辑的事务和持久化来作为规划组件粒度的参考.在一般情况下,把需要在相同事务中使用的业务逻辑或者紧密关联的持久化数据结构合并成一个组件,显著地提高系统的性能.1.4 有状态会话bean 运行结束时及时被显式删除在本系统中,当EJB 客户机不再需要有状态会话bean 时,该客户机用re move ()方法将它删除.调用re move 方法之后,对有状态会话bean 的引用会停用.这样,应用程序减少了对钝化(pa ssivation )的需要、最小化容器开销和提供更高级的性能.消除了容器对许多有状态会话bean 的管理所耗费的资源.1.5 J N D I 优化JND I AP I 被用于执行名字和目录服务.每种EJB 组件(会话、实体和消息驱动的)都有hom e 接口,EJB 通过home 接口来使用其功能.EJB 应用程序依靠JND I 查找来访问其hom e 接口.因为EJB 应用程序往往运行多个bean,并且因为许多组件中经常使用JND I 查找,所以应用程序大部分性能开销都花费在这些查找上所以通过缓存高速缓存I x ,可以提高应用程序的性能即在组件初始化期间创建一次I x ,然后保存它,以供日后的查找请求使用073暨南大学学报(自然科学版)2006年 .nitial Conte t .nitial Conte t .2 本系统的性能定量分析在本系统的开发设计初期,为了优化本系统的性能,进行了大量的对比测试,最终才确认了系统的设计方案.因为篇幅所限,本节只是举出两组典型测试的例子,分析本系统主要的几种优化策略为系统性能的提升带来的效益,为简化和明了,当对比测试时,除了优化部分有区别,其他的测试环境保持一致.2.1 负载测试工具The Grinder 是测试J2EE 应用程序的优秀工具,它是B S D 风格的免费软件.The Grinder 可以作为J2EE 应用程序的负载测试工具,该工具可以模拟任意数量的用户使用你的站点,并且测试过程可以获取重要的分析数据如平均响应时间等.2.2 测试用例及测试环境由于本文主要探讨的是J2EE 环境中的性能测试和优化问题,在实际环境中,进行了大量对比测试最终才选择确定了几种技术方案.在本文中,为了简单起见,仅选择几个典型的测试用例进行对比分析,具体的测试用例列表如表1所示.表1 测试用例列表组别名称描述观察值用户数1Session Fascade利用会话外观TaskHandlerEJB 来访问Entity EJ B W ithout Sessi onFascade 不利用会话外观而是直接访问Entit y E JB AAR T R PS 2V alueObject利用值对象Propose Info 对象的设计模式W ithout V a lueObjec t 不用值对象的设计模式1个:最小环境100个:典型环境500个:苛刻环境 对于上述测试用例,主要观察以下几个指标来判断其性能的优劣:(1)ART (A verage Re s ponse Ti m e ),指的是测试脚本中每个请求的平均响应时间,是通过计算每个运行脚本的模拟用户的每个单独响应时间的算术平均值实现的[1],该数据通过测试工具Grinde r 获得.(2)A ART,AART 指的是组成测试脚本的所有请求的AR T 平均值.这个指标反映系统的响应速度,值越小表示响应速度越快[1],该数据通过测试工具Grinder 获得.(3)R PS(R equests Per Second),指的是在1s 的时间内处理的请求数.它是一个容量测度,代表的是一个测试脚本中所有请求的事务率[1].该数据通过测试工具Grinder 获得.由于本系统的CPU 和内存这两个指标的配置相当高,而且又采用了集群的方式,在各种环境下系统资源都比较有保证,在测试过程中只是通过观察比较,并不是测试重点关心的问题,所以在此处没有单独列出.对于上述用例的测试,每5s 钟记录一次性能测度,收集150个样本进行统计.考虑到系统稳定所经历的初始测试周期,排除掉前5个样本,只取后个样本进行统计分析 为了测试用户的数量,分别采用了个、个和5个的情况进行测试而且选择的是在无思考时间的状态下进行的一个用户的情况是最基本的情况,而该客户服务系统大部分时173第3期朱岸青,等: J2EE 系统的EJB 技术性能测试和优化 0100.110000..图3 测试的硬件环境配置图间都运行在100个用户同时操作的状态下,峰值可能达到500个用户同时使用该系统.测试的硬件环境配置如图3所示.测试数据的数量级在109条记录.2.3 运行测试及结果分析以下对上述2组的测试用例及其反映出来的AART 和RPS 性能优越性进行分析和比较.(1)采用会话外观与不采用会话外观的性能比较. 会话外观是J2EE 架构应用程序中的一种十分重要的设计模式,它是通过会话bean 封装W eb 组件需要执行的存取器逻辑来实现的,主要是要减少远程方法调用的开销和层直接精细耦合的性能损失[1-2].图4、图5反映了本系统中是否使用会话外观所带来的不同的性能的一个具体例子.图4 总的ART 图图5 RPS 图 从图4、5中可以看出,使用会话外观的性能明显优于没有使用会话外观.在典型的环境中(100个用户),使用会话外观的AAR T 仅是没有使用会话外观的17%,而系统吞吐量前者是后者的267%,系统性能明显提升.(2)采用值对象与不采用值对象的性能比较.值对象的主要功能有2个,一是通过减少对实体bean 存取器的精细调用而降低潜在的网络通信量;二是通过较粗地访问bean 的字段值给客户端提供实体bean[1].图6、图7是本系统中是否使用值对象所带来的不同的性能的一个具体例子.图6 总的ART 图图7 RPS 图 从图6、中可以看出,使用值对象的性能明显优越于没有使用值对象在苛刻的环境中(5个用户),使用值对象的R T 仅是没有使用会话外观的%,而系统吞吐量前者是后者的%,系统性能明显提升273暨南大学学报(自然科学版)2006年 7.00AA 29211.[参考文献][1] PETER Z adrozny,PH I L IP A st on,TE D O sb o rne .J2EE 性能测试[M ].北京:电子工业出版社,2003.[2] 贺平.软件测试技术[M ].北京:机械工业出版社,2004.[3] 纽伯格.精通B E A W E BLOGI C SERVER ———构建与部署J2EE 应用的最佳策略[M ].王崧译,北京:电子工业出版社,2004.[4] 李代平.Orac le 9i 数据库系统管理[M ].北京:冶金工业出版社,2003.[5] ANGE LA Y ochem,DAV I D Ca rls on,T A D St ephens .J2EE 应用与B E A WE BLOG I C SERVER (第2版)[M ].谢俊译.北京:电子工业出版社,2005.[6] DEEP AK A lur,JOHN C rup i,DAN M alks .J2EE 核心模式[M ].北京:机械工业出版社,2002.[7] 吴恒山,余华兵.一种开放式性能测试框架的研究与应用[J ].计算机应用,2005,25(2):352-354.[责任编辑:王蔚良](上接第355页)[参考文献][1] CHEN C,MANG ASAR I A N O .S moothing m ethods for convex i nequa lities and linea r co mp lementarit y pro 2bl em s[J ].M athe m ati ca l Programm ing,1995,71:51-69.[2] E NGE LKE S,K ANZ O W C.Predic t or -correc t or s moothing m ethods for t he s oluti on of linear program s[R ].Hamburg :Depa rt m ent of Ma thema tics,Uni ve rsit y of Hamburg,Ma rch 2000.[3] 李兴斯.一类不可微优化问题的有效解法[J ].中国科学A 辑,1994,24(4):371-377.[4] CHE N B ,CHE N X .A globa l and su pe rlinea r continuti on -s moothing me thods for and NCP or mon otone NCP[J ].SI A M Journal on Opti m izati on,1999,9:624-645.[5] CHE N B ,XI U N .A gl oba l li near and l ocal quadra tic non -interi o r continuati on me th od for nonli near co mple 2m entarity problem s ba sed on Chen -M angasa ri an s moothing func ti on [J ].S I A M Journal on Op ti m izati on,1999,9:605-623.[6] 张培爱.求解混合互补问题的一个非内点延拓方法[J ].暨南大学学报:自然科学版,2005,26(3):279-283.[7] W I LL H,K LAUS S .T e st example s for n onlinea r p r ogra mm i ng code s[G].Lectures Notes in Econo m ics andM athem atica l Syste m s .New Y o rk:Springe r -Ve rlag,1981.[责任编辑:王蔚良]373第3期朱岸青,等: J2EE 系统的EJB 技术性能测试和优化 。
J2EE系统优化之对象与循环简介J2EE系统优化之对象与循环简介条例一:尽量重用对象,避免创建过多短时对象对象在面向对象编程中随处可见,甚至可以毫不夸张的说是:“一切都是对象”。
如何更好的创建和使用对象,是优化中要考虑的一个重要方面。
笔者将对象按使用分为两大类:独享对象和共享对象。
独享对象指由某个线程单独拥有并维护其生命周期的对象,一般是通过new创建的对象,线程结束且无其它对这个对象的引用,这个对象将由垃圾收集机制自动GC。
共享对象指由多个线程共享的对象,各线程保持多个指向同一个对象的引用,任何对这个对象的修改都会在其它引用上得到体现,共享对象一般通过Factory工厂的getInstace()方法创建,单例模式就是创建共享对象的标准实现。
独享对象由于无其它指向同一对象的引用,不用担心其它引用对对象属性的修改,在多线程环境里,也就不需要对其可能修改属性的方法加以同步,减少了出错的隐患和复杂性,但由于需要为每个线程都创建对象,增加了对内存的需求和JVMGC的负担。
共享对象则需要进行适当的同步(避免较大的同步块,同时防止死锁)。
还有几种特殊对象:不变对象和方法对象。
不变对象指对象对外不含有修改对象属性的方法(如set方法),外部要修改属性只能通过new新的实例来实现。
不变对象最大的好处就是无需担心属性被修改,避免了潜在的bug,并能无需任何额外工作(如同步)就很好的工作在多线程环境下。
如jdk的String对象就是典型的不变对象。
方法对象简单的说就是仅包含方法,不含有属性的对象。
由于没有对象属性,方法中无需进行修改属性的操作,也就能采用static方法或单例模式,避免每次使用都要new对象,减少对象的使用。
那么该如何确定创建何种对象,这就要结合对象的使用方式和生命周期、对象大小、构建花销等方面来综合考虑。
如果对象生命周期较长,会存在修改操作,不能容忍其它线程对其的修改,就应该采用独享对象,如常见的Bean类。
而如果对象生命周期较长,且能为各个线程共享,就可以考虑共享对象。
共享有2种常见情况,一种是系统全局对象,如配置属性等,各个线程应该引用同一对象,任何对这个对象的修改都会影响其它线程;另一种是由于对象创建开销较大,各线程对此对象是瞬时访问,且无需再次读取其属性,如常见的Date对象,一般这种对象的使用是瞬时的,比如把它format成String,如果每次创建然后等待GC就会浪费大量内存和CPU时间,较好做法就是做成共享对象,各个线程先set再使用,注意对进行set并访问的方法要同步。
不变对象一般使用在对象创建开销较小(属性较少,类层次较少),且需要能自由共享的情形。
如一个对象里的常量对象,使用publicstaticfinalAAA=newAAA(…)创建。
方法对象使用较广,如Util类、DAO类等,这些对象提供操作其它对象(一般是bean对象)的接口,能对系统在层次和功能上进行解耦合。
条例二:在循环处,多下功夫循环作为程序编写的基本语法,可以说是随处可见。
一些小的细节能带来性能上的提升,而对循环体的一些改写,能带来性能的大幅提升。
比如最简单的List遍历,会有这样的写法:for(inti=0;i同样是对List的操作,如果要在遍历同时进行增加和删除操作,代码如下:for(inti=0,j=l.size();i=0;i--){l.remove(i);}。
经过测试,如果采用ArrayList,两种写法在循环次数较少时没有太大的区别,循环次数为1000,均为1ms以内,次数为10000,前一种为60ms左右,后一种为1ms以内,,而次数上到100000,前一种为6000ms左右,后一种为15ms,随着循环次数的增多,后一种较前一种的效率优势明显提高。
这是由Collection库ArrayList的实现决定的,以下是jdk1.3的ArrayList源码:publicObjectremove(intindex)RangeCheck(index);modCount++;ObjectoldValue=elementData[index];intnumMoved=size-index-1;if(numMoved>0)System.arraycopy(elementData,index+1,elementData,index,n umMoved);elementData[--size]=null;//LetgcdoitsworkreturnoldValue;>从中我们可以看出,numMoved代表了需要进行arraycopy操作的数量,它是由remove的位置决定的,如果index=0,也就是删除第一个元素,则需要arraycopy后面的所有数据,而如果index=size-1,则只需将最后一个元素设为null即可。
所以从后面向前循环remove是比较好的写法。
如果List中的确存在较多的add或remove操作,且容量较大(如存储几万个对象),则应该采用LinkedList作为实现。
LinkedList内部采用双向链表作为数据结构,比ArrayList占用较多内存空间,且随机访问操作较慢(需要从头或尾循环到相应位置),但插入删除操作很快(仅需进行链表操作,无须大量移动或拷贝)。
对于List操作如果循环规模较小,其实对性能影响非常小(ms 级),远远不是性能瓶颈所在。
但心中有着优化的意识,并力求写出简洁高效的程序应该是我们每个程序员的追求。
而且一旦在循环规模较大时,如果有了这些意识,也就能有效的消除性能隐患。
再举一个与优化无关但确实可能成为性能杀手(可以说是bug)的循环的'例子。
下面是源代码:for(;totalRead<m_totalBytes;totalRead+=readBytes)readBytes=m_request.getInputStream().read(m_binArray,tot alRead,m_totalBytes-totalRead);这个代码意图很清楚,就是将一个InputStream流读到一个byte数组中去。
它使用read方法循环读取InputStream,该方法返回读取的字节数。
正常情况下,该循环运行良好,当totalRead=m_totalBytes时,结束循环,byte数组被正常填充。
但如果仔细看一下InputStream的read方法的说明,了解一下其返回值就会发现,返回值可能为-1,即已读到InputStream末尾再继续读时。
如果发生读取异常,可能出现这个问题,而这个循环没有检查readBytes值是否为-1就往totalRead上加,这样再次进入循环体继续读取InputStream,又返回-1,继续循环。
如此循环直到int 溢出才会跳出循环。
而这个循环也就成了实实在在的CPU杀手,可以占去大量的CPU时间(取决于操作系统)。
其实解决很简单,对readBytes进行判断,如果为-1则跳出循环。
这个例子告诉我们:对循环一定要搞清循环的循环规模、每次循环体执行时间、循环结束条件包括异常情况等,只有这样才能写出高效且没有隐患的代码。
电脑ktv点歌系统双屏设置,怎么设置ktv点歌系统双屏(一)1、在桌面点击鼠标右键,再用鼠标左键点击“属性”,弹出下面(图1)的对话框:点击“设置”选项,可以看到屏幕中间出现了两个框,1为实线框代表你目前正在使用的显示器,2为虚线框,代表你要设置的第二个监视器。
如下(图2):点击有虚线框的2显示器,进行对第2监视器的编辑。
如(图3)把“将windows桌面扩展到该监视器上勾选中,此时2显示器变为实线框,如(图4)。
此时你可以对2显示器进行屏幕分辨率和颜色质量的相应设置。
为了确认我们是否设置成功。
你可以点击“识别”按钮,此时你的电脑显示器上会显示一个大的白色的1,而你的电视机(打开电源的电视机并且连接上显卡的视频输出)上会显示一个大的白色的2,说明你设置成功。
操作到这一步,你电脑ktv点歌系统双屏设置就成功了!是不是很简单咧!PowerPointji幻灯片制作教程—课程8:自动切换和循环音乐(一)八、自动切换和循环音乐有时候我们想让幻灯片一张一张自动播放,同时播放一首背景音乐,从而产生出电影的效果,下面我们通过一个练习来学习操作;1、插入音乐1)启动PowerPoint,自动打开一个空白文档;2)点菜单“文件-打开”命令,打开上一课的幻灯片“动作设置”;3)选中第一张幻灯片,点“插入-影片和声音-文件中的声音..”,在出来的提示框中选择“自动播放”;这样就会在幻灯片中央出来一个小喇叭图标,这是我们插入的音乐对象;点菜单“文件-另存为”,以“循环切换”为文件名,保存文件到自己的文件夹;2、设置音乐1)在出来的小喇叭上敲右键,选择“编辑声音对象”,出来一个对话框;把两个勾都打上,这样音乐就可以一直播放,直到停止,点“确定”返回;2)设置停止,在小喇叭上点右键,选择“自定义动画..”,右边的窗格出来动画选项;2)在音乐右边的下拉按钮上点一下,在出来的菜单中选“效果选项”,出来一个面板;3)在效果选项面板中,单击中间的停止,选择“在6张幻灯片后”,因为演示文稿总共有6张;点“确定”返回,保存一下文件,放映一下看看效果;3、幻灯片切换1)选中第一张幻灯片,点菜单“幻灯片放映-幻灯片切换”;2)右边的窗格中出现许多切换效果,可以选择一种;3)在下边的换片方式中,去掉“单击..”的勾,勾选下面的“每隔”,在旁边的时间中输入5秒;4)点一下下边的“应用于所有幻灯片”按钮,这样所有的幻灯片都是每隔5秒切换;当然也可以一张一张设置,那些需要自动切换的幻灯片;5)保存一下文件,放映一下看看效果,是否是每隔5秒就自动到下一张幻灯片,同时一直播放音乐;。