回 帖 发 新 帖 刷新版面

主题:[讨论]构建高性能J2EE应用的十个技巧

构建高性能的J2EE应用不但需要了解常用的实施技巧。下面介绍最常用的10种有效方法,可帮助架构设计师们快速成为这方面的专家。

Java性能的基础—内存管理

任何Java应用,单机的或J2EE的性能基础都可归结到你的应用是如何管理内存的问题。Java的内存管理包括两个重要任务:内存的分配和内存的回收。在内存的分配中,目标是要减少需要创建的对象。

内存回收是导致性能下降的普遍原因。也就是说,内存中的对象越多,垃圾回收越困难。所以我们对创建对象的态度应该越保守越好。

在J2EE应用中常见的两个内存有关的问题是:游离的对象(也被称为内存泄露)和对象循环(指大量频繁创建和删除-在Java中体现为解除引用—对象)。

我们应注意确保所有可到达的对象实际是活的,即这些对象不但在内存中,而且也要在执行的代码中是存在的。当对象在应用中已经没有用了,而我们却忘记了删除对该对象的引用时,游离的对象就出现了。

我们知道垃圾回收会占用CPU时间。短期对象的大量创建增加了垃圾回收的频率会造成性能下降。

不要在Servlet中实现业务逻辑

在构建J2EE应用时,架构工程师通常会使用到J2EE的基本部分——Servlet。如果架构师不使用Session Beans, Entity Beans, 或 Message Beans, 那么改进性能的方法就很少。只能采用增加CPU或更多的物理服务器等方法。EJB使用了缓存(cache)和资源池等方法可以提高性能和扩展性。

尽可能使用本地接口访问EJB

在早期的J2EE (遵循EJB1.X规范)应用中,访问EJB是`通过RMI使用远程接口实现的。随着EJB2.0的出现,可以通过本地接口访问EJB,不再使用RMI,在同一个JVM中使用远程方法已经少多了。但是现在还是有一些使用EJB1.X实现的应用和不知道使用本地接口的一些EJB新手。为说明这点,我们作个比较:

1、客户端应用调用本地Stub

2、该Stub装配参数

3、该Stub传到skeleton

4、该skeleton分解参数

5、该skeleton调用EJB对象

6、EJB对象执行容器服务

7、EJB对象调用企业BEAN实例

8、企业BEA执行操作

9、执行组装/分解步骤然后返回

与远程接口处理相比较,本地接口的EJB方法是:

1、客户端调用本地对象

2、本地对象执行容器服务

3、本地对象调用企业Bean实例

4、企业Bean实例执行操作

5、没有其他返回步骤!

如果你不需要从远程的客户端访问一个特殊EJB,就应该使用本地方法。

在实现Session Bean的服务中封装对实体EJB的访问

从Servlet访问实体EJB不但效率低而且难于维护。使用Session Facade(会话外观)模式可把对实体EJB的访问封装在会话EJB中,在该会话EJB中通过使用本地接口访问实体EJB而避免过多的远程调用。

这项技术会有额外的性能和扩展方面的好处,这是因为会话和实体EJB可以使用缓存和资源池技术来进行改进。另外,由于负载的需要,会话和实体EJB可被扩展部署到其他硬件设备上,这比将Servlet层复制扩展到其他硬件设备上要简单的多。

尽量粗粒度访问远程EJB

当访问远程EJB时,调用set/get方法将产生过多的网络请求,同时也导致远程接口处理的过载。为避免这种情况,可考虑将数据属性集中在一个对象中,这样通过一次对远程EJB的调用就可以传递所有数据。这项技术就是数据传输对象(Data Transfer Object)模式。

优化SQL

J2EE 的架构设计工程师和开发人员通常不是SQL专家或经验丰富的数据库管理员。首先应该确保SQL使用了数据库提供的索引支持。在某些情况下,将数据库的索引和数据分开存放会提高性能。但要知道,增加额外的索引可以提高SELECT性能但也会降低INSERT的性能。对于某些数据库,关联表之间的排序会严重影响性能。可以多向数据库管理员咨询。

避免在实体EJB中过多执行SQL

有时候,通过实体EJB访问数据会执行多个SQL语句。根据J2EE 规范,第一步,将调用实体Bean的find(发现)方法;第二步,在第一次调用实体EJB的业务方法时,容器会调用ejbLoad()从数据库中获得信息。

很多CMP(容器管理持久性)在调用发现方法时就缓存了实体数据,所以在调用ejbLoad()时就不再访问数据库了。应该避免使用BMP(Bean管理的持久性)或者自己实现缓存算法避免二次访问数据库。

使用Fast Lane Reader 模式访问只读数据

J2EE 应用经常要以只读方式访问大量长时间不变的数据,而不是访问单个实体,例如浏览在线产品目录。在这种只读情况下,使用实体EJB访问数据会导致严重过载并且实现很麻烦。实体EJB 适合于对单个实体的粗粒度访问,访问大量的列表只读数据时效率不高。不管是使用CMP还是BMP,一定需要编写代码操作多个实体EJB及其关联。这将导致访问多个数据库并存在大量的也是不必要的事务开销。

利用Java Messaging Servce(消息服务)

J2EE规范在JMS中提供了内置的异步处理服务。当涉及到系统需求时,应该了解在什么情况下应该采用JMS进行异步处理的设计。一旦确定要执行一些异步处理,那么同步处理的任务就应该越少越好,将数据库密集的操作安排在稍后的异步处理中完成。

缓存JNDI Lookup查找

很多操作在进行JNDI查找时要消耗大量资源。通常应该缓存JNDI资源避免网络调用和某些处理的过载。可以缓存的JNDI查找包括:

EJB Home Interfaces

Data Sources

JMS Connection Factories

MS Destinations/Topics

一些JNDI包实现了缓存功能。但是调用对EJB主接口的narrow方法时,这种功能作用有限。缓存查找的设计应该使用共享的IntialContext 实例,尽管构建它很麻烦。这是因为需要访问多种数据源,包括应用资源文件JNDI.properties,系统属性的各项参数,传入到构造函数的各项参数。

QQ 744437114

疯狂软件官网:www.fkjava.org

疯狂java视频 android视频:http://www.fkjava.org/video.html

回复列表 (共1个回复)

沙发

还记得每年年末在区委宣传部进行晚报大收订时,经常碰到街道办事处与社区的负责人,他们总是对我说:小刘,这晚报可是我们一家一家跑来的,投递质量一定得保证,不然客户不满意明年再征订那就是难上加难了。每当听到这些话时,我都会笑着回答他们:只要将详细地址与电[url=http://t.163.com/8882574405]龟头炎是怎么引起的[/url]话号码登记好,我们保证每一位客户都能准时收到晚报。
  数年如一日,发行部的同事每每接到客户的投诉来电时,都会认真耐心的力求完美的解决问题。
  有一次徐主任接到俞社长来电,说是市政府某退休干部近十天未收到晚报,徐主任在第一时间与该片区投递员联系,当时投递员表示每天上午十点钟左右就将晚报放到报箱了,既然每天都按时投递了那为什么客户又没收到呢?在严查无果的情况下,带着疑问徐主任、何站长与投[url=http://user.qzone.qq.com/2368704378/]南京男科医院[/url]递员一同前往客户家中[url=http://t.163.com/6843630422]阳痿什么症状[/url]了解情况,最终水落石出,原来是这老干部的报箱旁边还有几个订户的报箱,旁边订户将老干部报箱里的晚报误取了,自家报箱近十天的晚报紧扎的填在里面。最后将情况与老干部说明了并将缺失的晚报补齐,该老干部对此非常满意。
  很多时候在接到客户来电时,他们都会用一种极其责备甚至是质问的语气道出心中的不满,尽管这样我还是会心平气和的听他们说完,然后问清楚情况后予以解决。
  今年4月20日上午,烟厂一老年读者来电说18号的晚报他没收到,还非常气愤的说:投递员是不是将他的报纸贪污卖废纸去了,一点素质都没有一点纪律性也没有。我问他具体地址他又不说,只说自己是二区13栋的住户,摸到这点信息,我向他没收看到18号的晚报表示道歉,并对此承诺联系投递员将情况弄清楚之后再给他回复,投递员杨师傅一直坚持说每天都已送到,没有偷过一天懒。由于地址不详,无法实地考察情况,杨师傅要求与客户电话联系。几分钟之后客户给我来电,说投递员向他道歉了,其实这只是误会一场,原来杨师傅在给13栋送报时在楼道里正好碰到这老年读者的老伴,其老伴将报纸从他手中接走了。最后这读者还很歉意的表示自己开始的语气有点重,希望我能原谅。我说:为客户服好务是我们的职责,少了误会,彼此多了份信任,这样的处理方式希望您们能满意。
  后来回想这位读者开始的态度与之后的转变,心中不由得泛起阵阵暖意。其实每一位读者都是不会鸡蛋里挑骨头,没事找事,无理狡三分的。只是由于各方面的原因让客户没能很好的享受自己的权利。
  俗话说抱憾是买主,抱怨是商机。正是因为客户需要我们的产品和服务,只是由于我们的产品和服务中还存在一些不能令他们十分满意的地方,所以才抱憾;使用了产品和消费了服务之后发生抱怨,也是因为产品和服务有瑕疵,有些地方他们认为应该改进,应该更加合理,更加人性化。
  因此,每当收到客户的抱憾与抱怨时,我们发行部的同仁都会认真对待,仔细分析。在典型事例中查找客户不满意的原因,再研究出客户切实需求的产品[url=http://t.163.com/1334363795]生殖感染[/url]与服务。现在我们的产品和服务与读者的需求越来越一致。
  我坚信通过我们大家不懈的努力,一定能让我们的晚报百尺竿头更上一楼,订户的满意,就是我们的微笑。還記得每年年末在區委宣傳部進行晚報大收訂時,經常碰到街道辦事處與社區的負責人,他們總是對我說:小劉,這晚報可是我們一傢一傢跑來的,投遞質量一定得保證,不然客戶不滿意明年再征訂那就是難上加難瞭。每當聽到這些話時,我都會笑著回答他們:隻要將詳細地址與電話號碼登記好,我們保證每一位客戶都能準時收到晚報。
  數年如一日,發行部的同事每每接到客戶的投訴來電時,都會認真耐心的力求完美的解決問題。
  有一次徐主任接到俞社長來電,說是市政府某退休幹部近十天未收到晚報,徐主任在第一時間與該片區投遞員聯系,當時投遞員表示每天上午十點鐘左右就將晚報放到報箱瞭,既然每天都按時投遞瞭那為什麼客戶又沒收到呢?在嚴查無果的情況下,帶著疑問徐主任、何站長與投遞員一同前往客戶[url=http://t.qq.com/njyyzlx]哪家医院治疗早泄好[/url]傢中瞭解情況,最終水落石出,原來是這老幹部的報箱旁邊還有幾個訂戶的報箱,旁邊訂戶將老幹部報箱裡的晚報誤取瞭,自傢報箱近十天的晚報緊紮的填在裡面。最後將情況與老幹部說明瞭並將缺失的晚報補齊,該老幹部對此非常滿意。
  很多時候在接到客戶來電[url=http://t.people.com.cn/njyyzh]如何治疗前列腺炎[/url]時,他們都會用一種極其責備甚至是質問的語氣道出心中的不滿,盡管這樣我還是會心平氣和的聽他們說完,然後問清楚情況後予以解決。
  今年4月20日上午,煙廠一老年讀者來電說18號的晚報他沒收到,還非常氣憤的說:投遞員是不是將他的報紙貪污賣廢紙去瞭,一點素質都沒有一點紀律性也沒有。我問他具體地址他又不說,隻說自己是二區13棟的住戶,摸到這點信息,我向他沒收看到18號的晚報表示道歉,並對此承諾聯系投遞員將情況弄清楚之後再給他回復,投遞員楊師傅一直堅持說每天都已送到,沒有偷過一天懶。由於地址不詳,無法實地考察情況,楊師傅要求與客戶電話聯系。幾分鐘之後客戶給我來電,說投[url=http://t.people.com.cn/ndgryw]包皮龟头炎的症状[/url]遞員向他道歉瞭,其實這隻是誤會一場,原來楊師傅在給13棟送報時在樓道裡正好碰到這老年讀者的老伴,其老伴將報紙從他手中接走瞭。最後這讀者還很歉意的表示自己開始的語氣有點重,希望我能原諒。我說:為客戶服好務是我們的職責,少瞭誤會,彼此多瞭份信任,這樣的處理方式希望您們能滿意。
  後來回想這位讀者開始的態度與之後的轉變,心中不由得泛起陣陣暖意。其實每一位讀者都是不會雞蛋裡挑骨[url=http://t.sohu.com/u/1417612192]前列腺炎的原因[/url]頭,沒事找事,無理狡三分的。隻是由於各方面的原因讓客戶沒能很好的享受自己的權利。
  俗話說抱憾是買主,抱怨是商機。正是因為客戶需要我們的產品和服務,隻是由於我們的產品和服務中還存在一些不能令他們十分滿意的地方,所以才抱憾;使用瞭產品和消費瞭服務之後發生抱怨,也是因為產品和服務有瑕疵,有些地方他們認為應該改進,應該更加合理,更加人性化。
  因此,每當收到客戶的抱憾與抱怨時,我們發行部的同仁都會認真對待,仔細分析。在典型事例中查找客戶不滿意的原因,再研究出客戶切實需求的產品與服務。現在我們的產品和服務與讀者的需求越來越一致。
  我堅信通過我們大傢不懈的努力,一定能讓我們的晚報百尺竿頭更上一樓,訂戶的滿意,就是我們的微笑。

我来回复

您尚未登录,请登录后再回复。点此登录或注册