a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 75|回复: 1

[基础知识] JAVA基础:构建高性能J2EE应用的十个窍门

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
构建高机能的J2EE应用不单需要体味常用的实施技巧。下面介绍最常用的10种有用体例,可辅佐架构设计师们快速成为这方面的专家。
* Z: o2 L2 c/ C# U0 f( S$ n& n8 z+ j+ t  Java机能的基本—内存打点
2 i9 ?4 o. O' [. ~# B. b$ k5 s$ h  任何Java应用,单机的或J2EE的机能基本都可归结到你的应用是若何打点内存的问题。Java的内存打点搜罗两个主要使命:内存的分配和内存的收受接管。在内存的分配中,方针是要削减需要建树的对象。 - z$ W1 s- N" A* p6 w
  内存收受接管是导致机能下降的普遍原因。也就是说,内存中的对象越多,垃圾收受接管越坚苦。所以我们对建树对象的立场应该越保守越好。 $ |3 U' l' _4 K5 O
  在J2EE应用中常见的两个内存有关的问题是:游离的对象(也被称为内存泄露)和对象轮回(指年夜量频仍建树和删除-在Java中浮现为解除引用---对象)。 0 h! `2 e# l$ L. w* t
  我们应注重确保所有可达到的对象现实是活的,即这些对象不单在内存中,而且也要在执行的代码中是存在的。当对象在应用中已经没有用了,而我们却健忘了删除对该对象的引用时,游离的对象就呈现了。
7 w7 e- Z: m1 W! i. s) T9 M5 P  我们知道垃圾收受接管会占用CPU时刻。短期对象的年夜量建树增添了垃圾收受接管的频率会造成机能下降。 # z2 }# K4 d- U, [
  不要在Servlet中实现营业逻辑
: }/ V/ l/ J% b+ l! {+ ]! {  在构建J2EE应用时,架构工程师凡是会使用到J2EE的根基部门——Servlet。如不美观架构师不使用Session Beans, Entity Beans, 或 Message Beans, 那么改良机能的体例就很少。只能采用增添CPU或更多的物理处事器等体例。EJB使用了缓存(cache)和资本池等体例可以提高机能和扩展性。
0 c/ y; k/ |1 F* ]3 ?  尽可能使用当地接口访谒EJB
7 ^  o! l; d5 H/ Q* ^: h. u4 s& v  在早期的J2EE (遵循EJB1.X规范)应用中,访谒EJB是`经由过程RMI使用远程接口实现的。跟着EJB2.0的呈现,可以经由过程当地接口访谒EJB,不再使用RMI,在统一个JVM中使用远程体例已经少多了。可是此刻仍是有一些使用EJB1.X实现的应用和不知道使用当地接口的一些EJB新手。为声名这点,我们作个斗劲: % U" h6 ~  b5 l4 L' w! u
  1、客户端应用挪用当地Stub
6 \. s7 N* |" r% Q) K! V) s/ ]  2、该Stub装配参数 8 {3 Y- V! D; L' D
  3、该Stub传到skeleton ' h. L) E" a5 h7 E0 f
  4、该skeleton分化参数
' }  C# r/ X! l- Y9 w  5、该skeleton挪用EJB对象 ) s: T* v8 q- `. D- b
  6、EJB对象执行容器处事 . ~! k/ W& n3 u4 r% s4 E
  7、EJB对象挪用企业BEAN实例 4 K! d- n- h* u' g
  8、企业BEA执行操作 : P" \$ s) a  N
  9、执行组装/分化轨范然后返回
0 u* E" B% e) _& W8 a  与远程接口措置对角力计较,当地接口的EJB体例是: ; M" c1 Z7 P  `) `( c
  1、客户端挪用当地对象
2 S9 u0 e$ r) A  B2 {$ p. }8 I% L  2、当地对象执行容器处事 $ [$ W! F8 h$ T  k4 E$ t
  3、当地对象挪用企业Bean实例
: o4 ~) p5 |0 H( }+ _- U  4、企业Bean实例执行操作
/ |1 h7 p: R, V" r! z2 S# G1 h  5、没有其他返回轨范!
8 a+ N+ B  B5 x4 N& w* {$ p) L  如不美观你不需要年夜远程的客户端访谒一个非凡EJB,就应该使用本处所法。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA基础:构建高性能J2EE应用的十个窍门

</p>在实现Session Bean的处事中封装对实体EJB的访谒
+ t" G9 O. y4 r) j6 h) T+ Q$ m5 P- a% M$ W
  年夜Servlet访谒实体EJB不单效率低而且难于维护。使用Session Facade(会话外不美观)模式可把对实体EJB的访谒封装在会话EJB中,在该会话EJB中经由过程使用当地接口访谒实体EJB而避免过多的远程挪用。
) e# l9 B: a) l5 d7 X  这项手艺会有额外的机能和扩展方面的益处,这是因为会话和实体EJB可以使用缓存和资本池手艺来进行改良。此外,因为负载的需要,会话和实体EJB可被扩展部署到其他硬件设备上,这比将Servlet层复制扩展到其他硬件设备上要简单的多。 " o; j4 Y: t4 @9 h( o
  尽量粗粒度访谒远程EJB
2 `5 \) f' S! P# p2 j9 f  当访谒远程EJB时,挪用set/get体例将发生过多的收集请求,同时也导致远程接口措置的过载。为避免这种情形,可考虑将数据属性集中在一个对象中,这样经由过程一次对远程EJB的挪用就可以传递所稀有据。这项手艺就是数据传输对象(Data Transfer Object)模式。
  w2 Q# c7 i* V+ m4 A+ k6 I& i  优化SQL 5 Y( B& W& {$ \% d
  J2EE的架构设计工程师和开发人员凡是不是SQL专家或经验丰硕的数据库打点员。首先应该确保SQL使用了数据库供给的索引撑持。在某些情形下,将数据库的索引和数据分隔存放会提高机能。但要知道,增添额外的索引可以提高SELECT机能但也会降低INSERT的机能。对于某些数据库,联系关系表之间的排序会严重影响机能。可以多向数据库打点员咨询。 : }: ^# u+ P8 e/ y3 K
  避免在实体EJB中过多执行SQL
/ _& V" n+ V/ H( Y& ^) s* h  有时辰,经由过程实体EJB访谒数据会执行多个SQL语句。按照J2EE 规范,第一步,将挪用实体Bean的find(发现)体例;第二步,在第一次挪用实体EJB的营业体例时,容器会挪用ejbLoad()年夜数据库中获得信息。 * e& u! k5 g' l% j3 |, K: ]' P
  良多CMP(容器打点持久性)在挪用发现体例时就缓存了实体数据,所以在挪用ejbLoad()时就不再访谒数据库了。应该避免使用BMP(Bean打点的持久性)或者自己实现缓存算法避免二次访谒数据库。 ! N& w' N' W4 s$ P9 c" D+ h2 [
  使用Fast Lane Reader 模式访谒只读数据 4 G2 n2 M! _7 H! G' b) b6 s
  J2EE应用经常要以只读体例访谒年夜量长时刻不变的数据,而不是访谒单个实体,例如浏览在线产物目录。在这种只读情形下,使用实体EJB访谒数据会导致严重过载而且实现很麻烦。实体EJB 适合于对单个实体的粗粒度访谒,访谒年夜量的列表只读数据时效率不高。不管是使用CMP仍是BMP,必然需要编写代码操作多个实体EJB及其联系关系。这将导致访谒多个数据库并存在年夜量的也是不需要的事务开销。 " j- |" d+ {5 k- ?/ V: H
  操作Java Messaging Servce(动静处事)
- b0 v$ l8 b% w0 O  J2EE规范在JMS中供给了内置的异步措置处事。当涉及到系统需求时,应该体味在什么情形下应该采用JMS进行异步措置的设计。一旦确定要执行一些异步措置,那么同步措置的使命就应该越少越好,将数据库密集的操作放置在稍后的异步措置中完成。
2 V7 k7 J" [7 b  缓存JNDI Lookup查找
; x$ _9 X- x  G  良多操作在进行JNDI查找时要耗损年夜量资本。凡是应该缓存JNDI资本避免收集挪用和某些措置的过载。可以缓存的JNDI查找搜罗: ' x  Q+ s* k$ Y9 g- I6 R0 [8 ~5 n# }
  EJB Home Interfaces ; D8 ~% U" Z! n
  Data Sources
$ X9 T3 n' p- U  JMS Connection Factories - a6 F! B7 u6 x, ^' D: @% L3 e1 e
  MS Destinations/Topics   一些JNDI包实现了缓存功能。可是挪用对EJB主接口的narrow体例时,这种功能浸染有限。缓存查找的设计应该使用共享的IntialContext 实例,尽管构建它很麻烦。这是因为需要访谒多种数据源,搜罗应用资本文件JNDI.properties,系统属性的各项参数,传入到机关函数的各项参数
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 20:27 , Processed in 0.228736 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表