ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:24.07KB ,
资源ID:30185408      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30185408.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(SSH架构性能优化方案.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

SSH架构性能优化方案.docx

1、SSH架构性能优化方案J2EE平台架构性能优化方案本文从服务器应用J2EE平台开发的系统的性能是系统使用者和开发者都关注的问题,端编程时应注意的几个方面讨论代码对性能的影响,并总结一些解决的建议。 关键词:性能,Java,J2EE,EJB,Servlet ,JDBC一、概要Java 2 P latform, Enterp rise Editi on (J2EE)是当前很多商业应用系统使用的开发平台,该技术提供了一个基于组件的方法来设计、开发、装配和部署企业级应用程序。J2EE平台提供了一个多层结构的分布式的应用程序模型,可以更快地开发和发布的新的应用解决方案。J2EE是一种技术规范,定义了整个

2、标准的应用开发体系结构和一个部署环境,应用开发者开发时只要专注于具体商业逻辑和商业业务规则的实现上,而其他的诸如事务、 持久化、安全等系统开发问题可以由应用程序容器或者服务器处理,开发完成后,就可以方便地部署到实现规范的应用服务器中。作为网络上的商业应用系统, 同时访问的人数是很多的,在大量访问的情况下, 过多的资源请求和有限的服务器资源(内存、 CPU时间、网络带宽等)之间就会出现矛盾,应用系统的性能就显得很重要了, 有时正确的代码并不能保证项目的成功, 性能往往是最后决定一个项目是否成功关键。本文主要从性能的角度出发,讨论 J2EE服务器端的代码性能优化和提升。二、常见的Java编程J2E

3、E语言基础是Java,常用的Java代码问题对应用系统的性能影响,F面讨论了一些应该注意方面。使用StringBufer 代替String 当处理字符串的相加时,常见的写法是:Stri ng str1 = Hello;String str2 = welcome to world;Stri ng str3 = str1 + , + str2 +!;很多人都知道,这样的代码效率是很低的,因为String是用来存储字符串常量的,如果要执行 牛”的操作,系统会生成一些临时的对象,并对这些对象进行管理, 造成不必要的开销。如果字符串有连接的操作,替代的做法是用StringBuffer 类的append

4、方法,它的缺省构造函数和append的实现是:public Stri ngBuffer() / 构造函数this(16); / 缺省容量 16P ublic syn chro ni zed Strin gBuffer appen d(Stri ng str) if (str = nu II) str = Strin g.valueOf(str);int len =str.le ngth();int n ewco unt = count + len;if(n ewco unt value .len gth)expan dCa pacity (n ewco un t);/扩充容量str.getCh

5、ars(0, le n, value, coun t);count = n ewco unt;return this;当字符串的大小超过缺省 16时,代码实现了容量的扩充,为了避免对象的重新扩展其容量,更好的写法为:Stri ngBuffer buffer = new Stri ngBufer(30); /分配指定的大小。buffer.a ppen d(hello);buffer.a ppen d(,);buffer.a ppen d(welcometo world!);String str = buffer.toStri ng();生成对象时,分配合理的空间和大小Java中的很多类都有它的默

6、认的空间分配大小,对于一些有大小的对象的初始化,应Stri ngBuffer该预计对象的大小,然后使用进行初始化,上面的例子也说明了这个问题,创建时,我们指定了它的大小。另外的一个例子是 Vector,当声明Vector vect = new Vector() 时,系统调用:public Vector() / 缺省构造函数this(10); / 容量是 10;缺省分配10个对象大小容量。当执行 add方法时,可以看到具体实现为:p ublic syn chro ni zed boolea n addQbject o) modCo un t+;en sureCa pacityHe Ip er(e

7、leme ntCo un t+1);eleme ntDataeleme ntCo un t+ =o;return true;p rivate void en sureCa pacityHe Ip er(i nt minCap acity) int oldCa pacity = eleme ntData .len gth;if (minCap acity oldCa pacity) Object oldData = eleme ntData;int n ewCa pacity = (ca pacity In creme nt 0) ? (oldCa pacity + cap acity In c

8、reme nt):(oldCa pacity * 2);if (n ewCa pacity minCap acity) n ewCa pacity = minCap acity;eleme ntData = new Object n ewCa pacity;System.arrayc opy( oldData, 0, eleme ntData, 0, eleme ntCo un t); 我们可以看到,当 Vector大小超过原来的大小时,一些代码的目的就是为了做容量的扩充,在预先知道该 Vector大小的话,可以指定其大小,避免容量扩充的开销,如知道Vector大小为100时,初始化是就可以象

9、这样。Vector vect = . new Vector(100);优化循环体循环是比较重复运行的地方, 如果循环次数很大,循环体内不好的代码对效率的影响就会被放大而变的突出。考虑下面的代码片:Vector vect = new Vector(IOOO);for( in ti=0; isize; i+)如果size=1000 ,就可以减少1000次size()的系统调用开销,避免了循环体重复调用。再看如下的代码片:for (int i = 0;i 100000;i+) if (i%10 = 9) ./ 每十次执行一次改写成也可以提高效率:for(i nti =0,j =10; i0 )val

10、ue =object.getValue();可以修改为:int value;if(i0 )NewObject object = new NewObject();Value =object.getValue();另外,应该尽量重复使用一个对象, 而不是声明新的同类对象。 一个重用对象的方法是改变对象的值,如可以通过 setValue 之类的方法改变对象的变量达到重用的目的。变量的注意事项尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈HeaP )中创建,(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(速度较慢。尽量使用静态变量, 即加修饰符stat

11、ic ,如果类中的变量不会随他的实例而变化, 就可 以定义为静态变量,从而使他所有的实例都共享这个变量。方法(Method )调用在Java中,一切都是对象,如果有方法( Method )调用,处理器先要检查该方法是 属于哪个对象,该对象是否有效,对象属于什么类型,然后选择合适的方法并调用。可以减少方法的调用,同样一个方法:public void CallMethod(i nt i ) if( i =0 )return;./ 其他处理如果直接调用,int i = 0;CallMethod(i);就不如写成:int i = 0;if( i =0 ) CallMethod(i);抛出异常首先要创建

12、一个新的对象, 并进行相关的处理,造成系统的开销,所以异常应该用while , if等处理。在错误处理的情况,不应该用来控制程序流程,流程尽量用在不是很影响代码健壮性的前提下,可以把几个try/catch 块合成一个。同步同步主要出现在多线程的情况,为多线程同时运行时提供对象数据安全的机制,多线程是比较复杂话题,应用多线程也是为了获得性能的提升,应该尽可能减少同步。另外,如果需要同步的地方,可以减少同步的代码段,如只同步某个方法或函数,而不是整个代码。使用Java系统APIJava的API 般都做了性能的考虑, 如果完成相同的功能, 优先使用API而不是自己写的代码,如数组复制通常的代码如下:

13、int size = 1000;Strin g strArray1 = new Strin gsize;Strin g strArray2 = new Strin gsize; for(i nti=0;isize;i+) / 赋值strArray1i = (new Stri ng(Array: + i);for(i nti=0;isize;i+) / 复制strArray2i=( new Stri ng(Stri ng)ai);如果使用Java提供的API,就可以提高性能:int size = 1000;Strin g strArray1 = new Strin gsize;Strin g s

14、trArray2 = new Strin gsize; for(i nti=0;isize;i+) / 赋值strArray1i = (new Stri ng(Array: + i); System.arrayc opy (strArray1,0,strArray2,0,size); /复制同样的一个规则是,当有大量数据的复制时,应该使用System.arrayc opy() 。三、I/O 性能输入/输出(I/O )包括很多方面,我们知道,进行 I/O操作是很费系统资源的。程序中应该尽量少用I/O操作。使用时可以注意:.合理控制输出函数 System.out.println()对于大多时候是有

15、用的, 特别是系统调试的时候, 但也会产生大量的信息出现在控制台和日志上,同时输出时,有序列化和同步的过程,造成了开销。特别是在发行版中,要合理的控制输出,可以在项目开发时,设计好一个Debug 的工具类,在该类中可以实现输出开关,输出的级别,根据不同的情况进行不同的输出的控制。使用缓存读写内存要比读写文件要快很多,应尽可能使用缓冲。尽可能使用带有 Buffer的类代替没有 Buffer的类,如可以用 BufferedReader 代替Reader,用 BufferedWriter 代替 Writer 来进行处理 I/O 操作。同样可以用 Bufferedl npu tStream代替Inpu

16、tStream 都可以获得性能的提高。四、ServletServlet采用请求 响应模式提供Web服务,通过ServletResponse 以及ServletRequest 这两个对象来输出和接收用户传递的参数,在服务器端处理用户的请求,根据请求访问数据库、访问别的 Servlet方法、调用EJB等等,然后将处理结果返回给客户端。尽量不使用同步Servlet是多线程的,以处理不同的请求,基于前面同步的分析,如果有太多的同步就失去了多线程的优势了。不用保存太多的信息在 Htt pSession 中很多时候,存储一些对象在 Htt pSession 中是有必要的,可以加快系统的开发,如网上商店系统

17、会把购物车信息保存在该用户的 Sessi on中,但当存储大量的信息或是大的对象在会话中是有害的,特别是当系统中用户的访问量很大,对内存的需求就会很高。具体开发时,在这两者之间应作好权衡。清除 Session通常情况,当达到设定的超时时间时,同时有些 Sessi on没有了活动,服务器会释放这些没有活动的 Session ,不过这种情况下,特别是多用户并访时,系统内存要维护多个的无效Session 。当用户退出时,应该手动释放,回收资源,实现如下:Htt pSessi on theSessi on = request.getSessi on(); 获取当前Session if(theSessi

18、on != null) theSessio n.i nvalidate(); /使该Session 失效五、EJB 问题EJB是Java服务器端服务框架的规范, 软件厂商根据它来实现 EJB服务器。应用程序开发者可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。 EJB规范详细地解释了一些最小但是必须的服务,如事务,安全和名字等。缓存Home接口EJB 库使用 Enterprise Bean的客户端通过它的 Home接口创建它的实例。客户端能通过JNDI访问它。服务器通过Lookup 方法来获取。JNDI是个远程对象,通过 RMI方式调用,对它的访问往往是比较费时的。所以,在设计

19、时可以设计一个类专门用来缓存 Home接口,在系统初始化时就获得需要的 Home接口并缓存,以后的引用只要引用缓存即可。封装 Entity Bean直接访问Entity Bean改进事务管理,因为每一个对是个不好的习惯,用会话 Bean封装对实体Bean的访问能够get方法的直接调用将产生一个事务,容器将在每一个实体Bean的事务之后执行一个“ Load! Store ” .操作。最好在 Session Bean中完成Entity Bean 的封装,减少容器的事务处理,并在Session Bea n 中实现一些具体的业务方法。释放有状态的Session Bean相当于 HttpSession

20、,当把一个 Session Bean 设为 Stateful ,即有状态的 SessionBean后,应用容器(Con tai ner )就可能有 钝化”(Passivate )和活化(Activate )过程,即在主存和二级缓存之间对 Sessio nBean 进行存储位置的转移,在这个过程中,存在 序列化过程。通常有状态Session Bean 的释放是在超时时发生,容器自动的清除该对象,但是如维护一份该果交给容器管理,一方面可能产生对象钝化,另一方面未超时期间,系统还要对象,所以如果我们确认使用完该 StatefulSession Bea n 后不再需要时,可以显式的将 其释放掉,方法是

21、调用:theSesi on Bea n. remove。;六、数据库访问在J2EE开发的应用系统中,数据库访问一般是个必备的环节。 数据库用来存储业务数 据,供应用程序访问。在Java技术的应用体系中,应用程序是通过 JDBC ( Java Database Connectivity实现的接口来访问数据库的, JDBC支持建立连接、SQL语句查询、处理结果”等基本功能。在应用JDBC接口访问数据库的过程中,只要根据规范来实现,就可以达到要求的功 能。明明根据规范编写的程但是,有些时候进行数据查询的效率着实让开发人员不如所愿,序,运行效果却很差,造成整个系统的执行效率不高。使用速度快的JDBC驱

22、动JDBC API包括两种实现接口形式,一种是纯Java实现的驱动,一种利用 ODBC驱动和数据库客户端实现, 具体有四种驱动模式并各有不同的应用范围, 针对不同的应用开发要选择合适的JDBC驱动,在同一个应用系统中,如果选择不同的 JDBC驱动,在效率上会有差别。例如,有一个企业应用系统,不要求支持不同厂商的数据库,这时就可以选择模式 的JDBC驱动,该驱动一般由数据库厂商实现的基于本地协议的驱动,直接调用数据库管理系统使用的协议,减少了模式 3中的中间层。使用JDBC连接池为了提高访问数据库的性能, 我们还可以使用JDBC 2.0 的一些规范和特性,JDBC是占用资源的,在使用数据库连接时

23、可以使用连接池Conn ection Pooli ng ,避免频繁打开、是比较消耗系统资源的。关闭Co nn ection 。而我们知道,获取 Conn ectionConn ecti on 缓冲池是这样工作的:当一个应用程序关闭一个数据库连接时, 这个连接 并不真正释放而是被循环利用,建立连接是消耗较大的操作,循环利用连接可以显著的提高 性能,因为可以减少新连接的建立。一个通过DataSource 获取缓冲池获得连接,并连接到一个 CustomerDB 数据源的 代码演示如下:Con text ctx = new In itialC on text();DataSource dataSour

24、ce = (DataSource) ctx.looku p(jdbc/CustomerDB);Connection conn =dataSource.getC onnection (” password,user name);缓存 DataSource一个DataSource 对象代表一个实际的数据源。这个数据源可以是从关系数据库到表格形式的文件,完全依赖于它是怎样实现的, 一个数据源对象注册到 JNDI名字服务后,应用程序就可以从JNDI服务器上取得该对象,并使用之和数据源建立连接。通过上面的例子,我们知道DataSource 是从连接池获得连接的一种方式, 通过JNDI方式获得,是占用资源

25、的。为了避免再次的JNDI调用,可以系统中缓存要使用的 DataSource 。关闭所有使用的资源系统一般是并发的系统,在每次申请和使用完资源后, 应该释放供别人使用, 数据库资源每个模式的含义可以参考SUN JDBC的文档,不同是比较宝贵的,使用完成后应该保证彻底的释放。请看下面的代码段:Connection conn = nu II;Stateme nt stmt = n ull;ResuItSet rs = null;try DataSource dataSource = getDataSource();/取的DataSource 的方法,实现略。conn = datasource.ge

26、tC onnection();stmt = conn .createStateme nt();rs = stmt.executeQuery(SELECT * FROM .);./ 其他处理rs.close();stmt.close();conn. close();catch (SQLExce pti on ex) ./ 错误处理粗看似乎没有什么问题,也有关闭相关如 Co nn ection 等系统资源的代码,但当出现异常后,关闭资源的代码可能并不被执行, 为保证资源的确实已被关闭, 应该把资源关闭的代码放到fin ally 块:Connection conn = nu II;Stateme n

27、t stmt = n ull;ResultSet rs = null;try DataSource dataSource = getDataSource();/取的DataSource 的方法,实现略。conn = datasource.getC onnection();stmt = conn .createStateme nt();rs = stmt.executeQuery(SELECT * FROM .);./ 其他处理catch (SQLExce pti on ex) ./ 错误处理fin allyif (rs!=null) try rs.closeO; / 关闭 ResultSetc

28、atch (SQLExce pti on ex) ./ 错误处理if (stmt!=null)try stmt.close(); / 关闭 Statement catch (SQLExce pti on ex) ./ 错误处理if (conn!=nu ll)try conn.close(); / 关闭 Connection catch (SQLExce pti on ex) ./ 错误处理大型数据量处理当我们在读取诸如数据列表、报表等大量数据时,可以发现使用EJB的方法是非常慢的,这时可以使用直接访问数据库的方法,用 SQL直接存取数据,从而消除 EJB的经常开支(例如远程方法调用、事务管理和数据序列化,对象的构造等)。缓存经常使用的数据对于构建的业务系统, 如果有些数据要经常要从数据库中读取,同时,这些数据又不经常变化,这些数据就可以在系统中缓存起来, 使用时直接读取缓存,而不用频繁的访问数据库读取数据。缓存工作可以在系统初始化时一次性读取数据,特别是一些只读的数据,当数据更新时更新数据库内容,同时更新缓存的数据值。一个例子是,在一套企业应用系统中,企业的信息数据(如企业的名称)在多个业务应 用模块中使用,这时就可以把这些

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1