1、始l?MVC 框架?br />
2、在每一层都应用自动单元试和测试管理?
3、按照规范来q行开发,而不是按照应用服务器来进行开发?
4、从一开始就计划使用 J2EE 安全性?br />
5、创建您所知道的?
6、当使用 EJB lgӞ始终使用会话 Facades?
7、用无状态会?beanQ而不是有状态会?bean.
8、用容器管理的事务?
9、将 JSP 作ؓ表示层的首选?br />
10、当使用 HttpSession Ӟ量只将当前事务所需要的状态保存其中,其他内容不要保存?HttpSession 中?br />
11、在 WebSphere 中,启动动态缓存,q?WebSphere servlet ~存机制?
12、ؓ了提高程序员的工作效率,?CMP 实体 bean 作ؓ O/R 映射的首选解x案?/span>
MVC 框架对于成功使用 J2EE 是如此重要,以致没有其他最佛_践可以与其相提ƈ论。模?视图-控制器(MVCQ是设计 J2EE 应用E序的基。MVC 您的程序代码简单地划分下面几个部分Q?/p>
负责业务逻辑的代码(x型——通常使用 EJB 或者普通的 Java 对象来实玎ͼ?/p>
负责用户界面昄的代码(卌䏀—通常通过 JSP 及标记库来实玎ͼ有时也?XML ?XSLT 来实玎ͼ?/p>
负责应用E序程的代码(x制器——通常使用 Java Servlet 或像 Struts 控制器这LcL实现Q?/p>
如果您不遵@基本?MVC 框架Q在开发过E中׃出现许多的问题。最常见的问题就是在视图部分d了太多的成分Q例如,可能存在使用 JSP 标记来执行数据库讉KQ或者在 JSP 中进行应用程序的程控制Q这在小规模的应用程序中是比较常见的Q但是,随着后期的开发,q样做将会带来问题,因ؓ JSP 逐步变得来难以维护和调试?/p>
cM圎ͼ我们也经常看到将视图层构建到业务逻辑的情c例如,一个常见的问题是在构徏视图时用的 XML 解析技术直接应用到业务层。业务层应该对业务对象——而不是绑定到视图的特定数据表C行操作?/p>
然而,只是h合适的lgq不一定意味着可以使您的应用程序得到合适的分层。我们常常见C些应用程序包?servlet、JSP ?EJB lg所有这三项Q然而,其主要的业务逻辑却是?servlet 层实现的Q或者应用程序导航是?JSP 中处理的。您必须q行严格的代码检查ƈ重构您的代码Q以保应用E序的业务逻辑只在模型层(Model layerQ进行处理,应用E序D只通过控制器层QController layerQ进行处理,而您的视图(ViewsQ只是将传递过来的模型对象?HTML ?JavaScript 的Ş式表C出来?/p>
在过ȝ几年中,在方法学领域有了相当大的革新Q例如新出现的被UCؓ AgileQ例?SCRUM [Schwaber] 和极限编E?[Beck1]Q的轻量U方法现在已l得C很普遍的应用。几乎所有的q些Ҏ中的一个共同的特征是它们都提倡用自动的试工具Q这些工具可以帮助开发h员用更少的时间进行回归测?(regression testing)Qƈ可以帮助他们避免׃不充分的回归试造成的错误,因此可以用来提高E序员的工作效率。实际上Q还有一U被UCؓ Test-First Development [Beck2] 的方法,q种Ҏ甚至提倡在开发实际的代码之前先~写单元试。然而,在您试代码之前Q您需要将代码分割成一些可试的片断。一?#8220;大惔?#8221;是难以测试的Q因为它不是只实C个简单的易于识别的功能。如果您的每个代码片断实现多个方面的功能Q这L代码难以保证其完全的正性?/p>
MVC 框架Q以?J2EE 中的 MVC 实现Q的一个优点就是元素的lg化能够(实际上,相当的简单)Ҏ的应用程序进行单元测试。因此,您可以方便地对实?bean、会?bean 以及 JSP 独立~写试用例Q而不必考虑其他的代码。现在有许多用于 J2EE 试的框架和工具Q这些框架及工具使得q一q程更加单。例如,JUnitQ是一U由 junit.org 开发的开放源代码工具Q和 CactusQ由 Apache 开发的开放源代码工具Q对于测?J2EE lg都非常有用。[Hightower] 详细探讨了如何在 J2EE 中用这些工兗?/p>
管所有这些详qC怎样d地测试您的应用程序,但是我们仍然看到一些h认ؓ只要他们试?GUIQ可能是Z Web ?GUIQ或者是独立?Java 应用E序Q,则他们就全面地测试了整个应用E序。GUI 试很难辑ֈ全面的测试,有以下几U原因。首先,使用 GUI 试很难d地测试到pȝ的每一条\径,GUI 仅仅是媄响系l的一U方式,可能存在后台q算、脚本和各种各样的其他访问点Q这也需要进行测试。然而,它们通常q不h GUI。第二,GUI U的试是一U非常粗_度的测试。这U测试只是在宏观水^上测试系l的行ؓ。这意味着一旦发现存在问题,则与此问题相关的整个子系l都要进行检查,q得找?bugQ缺P是非常困难的事情。第三,GUI 试通常只有在整个开发周期的后期才能很好地得到测试,q是因ؓ只有q那个时?GUI 才得到完整的定义。这意味着只有在后期才可能发现潜在?bug。第四,一般的开发h员可能没有自动的 GUI 试工具。因此,当一个开发h员对代码q行更改Ӟ没有一U简单的Ҏ来重新测试受到媄响的子系l。这实际上不利于q行良好的测试。如果开发h员具有自动的代码U单元测试工P开发h员就能够很容易地q行q些工具以确保所做的更改不会破坏已经存在的功能。最后,如果d了自动构建功能,则在自动构徏q程中添加一个自动的单元试工具是非常容易的事情。当完成q些讄以后Q整个系l就可以有规律地q行重徏Qƈ且回归测试几乎不需要h的参与?/p>
另外Q我们必d调,使用 EJB ?Web 服务q行分布式的、基于组件的开发得测试单个的lg变得非常必要。如果没?#8220;GUI”需要测试,您就必须q行低Qlower-levelQ测试。最好以q种方式开始测试,省得当您分布式的组件或 Web 服务作ؓ您的应用E序的一部分Ӟ您不得不p心思重新进行测试?/p>
MQ通过使用自动的单元测试,能够很快地发现系l的~陷Qƈ且也易于发现q些~陷Q得测试工作变得更加系l化Q因此整体的质量也得以提高?/p>
当您要背?J2EE 可以允许您做的事情的时候,q很Ҏ让您遭受不q。我们发现有一些开发h员钻研一?J2EE 允许之外的东西,他们认ؓq样做可?#8220;E微”改善J2EE的性能Q而他们最l只会发现这样做会引起严重的性能问题Q或者在以后的移植(从一个厂商到另一个厂商,或者是更常见的从一个版本到另一个版本)中会出现问题。实际上Q这U移植问题是如此严重Q以?[Beaton] 此原则UCؓUL工作的基本最佛_c?/p>
现在有好几个地方如果不直接?J2EE 提供的方法肯定会产生问题。一个常见的例子是开发h员通过使用 JAAS 模块来替?J2EE 安全性,而不是用内|的遵@规范的应用程序服务器机制来进行验证和授权。要注意不要q J2EE 规范提供的验证机Ӟ如果q了此规范Q这是pȝ存在安全漏洞以及厂商兼容性问题的主要原因。类似地Q要使用 servlet ?EJB 规范提供的授权机Ӟq且如果您要偏离q些规范的话Q要保使用规范定义?APIQ例?getCallerPrincipal()Q作为实现的基础。通过q种方式Q您能够利用厂商提供的强安全性基设施Q其中,业务要求需要支持复杂的授权规则?/p>
其他常见的问题包括用不遵@ J2EE 规范的持久性机Ӟq得事务管理变得困难)、在J2EEE序中用不适当的J2SE ҎQ例如线E或 singletonQ,以及使用您自qҎ解决E序到程序(program-to-programQ的通信Q而不是?J2EE 内在支持的机Ӟ例如 JCA、JMS ?Web 服务Q。当您将一个遵?J2EE 的服务器UL到其他的服务器上Q或者移植到相同服务器的新版本上Q上q的设计选择会造成无数的问题。唯一要背规范的情况是,当一个问题在规范的范围内无法解决的时候。例如,安排执行定时的业务逻辑?EJB2.1 出现之前是一个问题,在类DL情况下,我们当有厂商提供的解x案时׃用厂商提供的解决ҎQ例?WebSphere Application Server Enterprise 中的 Scheduler 工具Q,而在没有厂商提供的解x案时׃用第三方提供的工兗如果用厂商提供的解决ҎQ应用程序的l护以及其UL到新的规范版本将是厂商的问题Q而不是您的问题?/p>
最后,要注意不要太早地采用新技术。太q于热衷采用q没有集成到 J2EE 规范的其他部分或者还没有集成到厂商的产品中的技术常会带来灾难性的后果。支持是关键的——如果您的厂商不直接支持一U特定的?JSR 中提出的技术,但此技术还没有?J2EE 所接受Q那么您׃应该采用此技术。毕竟,我们中的大多Ch从事解决业务问题Q而不是推q技术的发展?/p>
在与我们合作的客户中Q一开始就打算启用 WebSphere J2EE 安全性的֮是非常少的,q一点一直让我们感到吃惊。据我们估计大约只有 50% 的顾客一开始就打算使用此特性。例如,我们曾与一些大型的金融机构Q银行、代理等{)合作q,他们也没有打启用安全性。幸q的是,q种问题在部|之前的查时得以解? 不?J2EE 安全性是危险的事情。假设您的应用程序需要安全性(几乎所有的应用E序都需要)Q您敢打赌您的开发h员能够构建出自己的安全性系l,而这个系l比您从 J2EE 厂商那里买来的更好。这可不是个好的赌注Qؓ分布式的应用E序提供安全性是异常困难的。例如,您需要用网l安全加密o牌控制对 EJB 的访问。以我们的经验看来,大多数自己构建的安全性系l是不安全的Qƈ且有重大的缺Pq产品pȝ极其脆弱?/p>
一些不使用 J2EE 安全性的理由包括Q担心性能的下降,怿其他的安全性(例如 Netegrity SiteMinderQ可以取?J2EE 安全性,或者是不知?WebSphere Application Server 安全Ҏ及功能。不要陷入这些陷׃中,其是,管?Netegrity SiteMinder q样的品能够提供优U的安全特性,但是仅仅其自w不可能保护整个 J2EE 应用E序。这些品必M J2EE 应用E序服务器联合v来才可能全面C护您的系l?/p>
其他的一U常见的不?J2EE 安全性的原因是:Z角色的模型没有提供够的_度讉K控制以满_杂的业务规则。尽事实是q样的,但这也不应该成ؓ不?J2EE 安全性的理由。相反地Q应该将 J2EE 验证?J2EE 角色与特定的扩展规则l合h。如果复杂的业务规则需要做出安全性决{,那就~写相应的代码,其安全性决{要Z可以直接使用的以及可靠的 J2EE 验证信息Q用?ID 和角Ԍ?/p>
反复的开发工作将使您能够逐渐地掌握所有的 J2EE 模块。要从创建小而简单的模块开始而不是从一开始就马上涉及到所有的模块?/p>
我们必须承认 J2EE 是庞大的体系。如果一个开发小l只是开始?J2EEQ这很难一下子p掌握它。在 J2EE 中有太多的概念和 API 需要掌握。在q种情况下,成功掌握 J2EE 的关键是从简单的步骤开始做赗?/p>
q种Ҏ可以通过在您的应用程序中创徏而简单的模块来得到最好的实现。如果一个开发小l通过创徏一个简单的域模型以及后端的持久性机Ӟ也许使用的是 JDBCQ?q且对其q行了完整的试Q这会增Z们的自信心,于是他们会用该域模型去掌握使用 servlet ?JSP 的前端开发。如果一个开发组发现有必要?EJBQ他们也会类似地开始在容器理的持久?EJB lg之上使用单的会话 FacadesQ或者用基?JDBC 的数据访问对象(JDBC-based Data Access ObjectsQDAOQ,而不是蟩q这些去使用更加复杂的构造(例如消息驱动bean和JMSQ?/p>
q种Ҏq不是什么新ҎQ但是很有开发组以这U方式来培养他们的技能。相反地Q多数开发组׃试马上构建所有的模块Q同时涉?MVC 中的视图层、模型层和控制器层,q样做的l果是他们往往会陷入进度的压力之中。他们应该考虑一些敏PAgileQ开发方法,例如极限~程QXPQ,q种开发方法采用一U增量学习及开发方法。在 XP 中有一U称?ModelFirst 的过E,q个q程涉及到首先构建域模型作ؓ一U机制来l织和实现用户场景。基本说来,您要构徏域模型作为您要实现的用户场景的首要部分,然后在域模型之上构徏一个用L面(UIQ作为用户场景实现的l果。这U方法非帔R合让一个开发组一ơ只学到一U技术,而不是让他们同时面对很多U情况(或者让他们d多书Q,q会令他们崩溃的?/p>
q有Q对每个应用E序层重复的开发可能会包含一些适当的模式及最佛_c如果您从应用程序的底层开始应用一些模式如数据讉K对象和会?FacadesQ您׃应该在您的JSP和其他视囑֯象中使用域逻辑?/p>
最后,当您开发一些简单的模块Ӟ在开始的初期可以对您的应用E序q行性能试。如果直到应用程序开发的后期才进行性能试的话Q这往往会出现灾难性的后果?/p>
当?EJB lgӞ使用一个会?Facades 是一个确认无疑的最佛_c实际上Q这个通用的实践被q泛地应用到M分布式的技术中Q包?CORBA、EJB ?DCOM。从Ҏ上讲Q您的应用程序的分布“交叉区域”是底层化,对小块的数据׃多次重复的网l中l造成的时间消耗就少。要辑ֈq个目的的方法就是:创徏大粒度的 Facades 对象Q这个对象包含逻辑子系l,因而可以通过一个方法调用就可以完成一些有用的业务功能。这U方法不但能够降低网l开销Q而且?EJB 内部通过为整个业务功能创Z个事务环境也可以大大地减对数据库的讉Kơ数?/p>
EJB 本地接口Q从 EJB 2.0 规范开始用)为共存的 EJB 提供了性能优化Ҏ。本地接口必被您的应用E序昑ּ地进行访问,q需要代码的改变和防止以后配|?EJB 旉要应用程序的改变。由于会?Facades 和它包含的整?EJB 对于彼此来说都应该是本地的,我们对会?Facades 后面的实?bean 使用本地接口。然而,会话 Facades 本n的实玎ͼ典型例子如无状态会?beanQ应该设计ؓq程接口?/p>
Z性能的优化,可以一个本地接口添加到会话 Facades。这样做利用了这样一个事实:在大多数情况下(臛_?Web 应用E序中)Q您?EJB 客户端和 EJB 会共同存在于同一?Java 虚拟机(JVMQ中。另外一U情况,如果会话 Facades 在本地被调用Q可以?J2EE 应用服务器配|优化(configuration optimizationsQ,例如 WebSphere 中的“No Local Copies”。然而,您必L意到q些可供选择的方案会交互方法从按g递(pass-by-valueQ改变ؓ按引用传递(pass-by-referenceQ。这可能会在您的代码中生很微妙的错误。当您要利用q些ҎӞ您应该在一开始就考虑其可行性?/p>
如果在您的会?Facades 中用远E接口(而不是本地接口)Q您也可以将同样的会?Facades ?J2EE 1.4 中以兼容的方式作?Web 服务来配|。这是因?JSR 109QJ2EE 1.4 中的 Web 服务部v部分Q要求用无状态会?bean 的远E接口作?EJB Web 服务?EJB 实现的接口。这样做是值得的,因ؓq样做可以ؓ您的业务逻辑增加客户端类型的数量?/p>
以我们的观点看来Q有状态会?bean 的概念已l过时了。如果您仔细对其考虑一下,一个有状态会?bean 实际上与一?CORBA 对象在体pȝ构上是完全相同的Q无非就是一个对象实例,l定C个服务器Qƈ且依赖于服务器来理其生命周期。如果服务器关闭了,q种对象也就不存在,那么q个 bean 的客L的信息也׃存在?/p>
J2EE 应用服务器ؓ有状态会?bean 提供的故障{U(failoverQ能够解决一些问题,但是有状态的解决Ҏ没有无状态的解决Ҏ易于扩展。例如,?WebSphere Application Server 中,Ҏ状态会?bean 的请求,是通过寚w|无状态会话的成员集群q行q加蝲来实现。相反地QJ2EE 应用服务器不能对有状?bean 的请求进行^衡加载。这意味着您的集群中的服务器的加蝲q程会是不均衡的。此外,使用有状态会?bean 会再添加一些状态到您的应用服务器上Q这也是不好的做法。这样就增加了系l的复杂性,q且在出现故障的情况下问题变得复杂化。创建健壮的分布式系l的一个关键原则是量使用无状态行为?/p>
因此Q我们徏议对大多数应用程序用无状态会?bean Ҏ。Q何在处理旉要用的与用L关的状态应该以参数的Ş式传送到 EJB 的方法中Qƈ且通过使用一U机制如 HttpSession 来存储它Q或者从持久性的后端存储Q例如通过使用实体 bean)作ؓ EJB 事务的一部分来进行检索。在合适的情况下,q个信息可以~存到内存中Q但是要注意在分布式的环境中保存q种~存所潜在的挑战性。缓存非帔R合于只L据?/p>
MQ您要确保从一开始就要考虑到可伸展性。检查设计中的所有设惻Iq且考虑到当您的应用E序要在多个服务器上q行Ӟ是否也可以正常运行。这个规则不但适合上述情况的应用程序代码,也适用于如 MBean 和其他管理界面的情况下?/p>
学习一?J2EE 中的两阶D|交事务,q且使用q种方式Q而不是开放您自己的事务管理。容器在事务优化斚w几乎L比较好的?/p>
使用容器理的事务(CMTQ提供了两个关键的优势(如果没有容器支持q几乎是不可能的Q:可组合的工作单元和健壮的事务行ؓ?/p>
如果您的应用E序代码昑ּC用了开始和l束事务Q也怋?javax.jts.UserTransaction 或者甚x本地资源事务Q,而将来的要求需要组合模块(也许会是代码重构的一部分Q,q种情况下往往需要改变事务代码。例如,如果模块 A 开始了一个数据库事务Q更新数据库Q随后提交事务,q且有模?B 做出同样的处理,误虑一下当您在模块 C 中尝试用上qC个模块,会出C么情况呢Q现在,模块 C 正在执行一个逻辑动作Q而这个动作实际上调用两个独立的事务。如果模?B 在执行中p|了,而模?A 的事务仍然能被提交。这是我们所不希望出现的行ؓ。如果,相反圎ͼ模块 A 和模?B 都?CMT 的话Q模?C 也可以开始一?CMTQ通常通过配置描述W)Qƈ且在模块 A 和模?B 中的事务是同一个事务的隐含部分Q这样就不再需要复杂的重写代码的工作了?/p>
如果您的应用E序在同一个操作中需要访问多U资源,您就要用两阶段提交事务。例如,如果?JMS 队列中删除一个消息,q且随后更新Zq条消息的纪录,q时Q要保证q两个操作都会执行或都不会执行就变得ؓ重要。如果一条消息已l从队列中被删除Q而系l没有更C此消息相关的数据库中的纪录,那么q种pȝ是不E_的。一些严重的客户及商业纠Uh自不一致的状态?/p>
我们时常看到一些客户应用程序试囑֮C们自q解决Ҏ。也怼通过应用E序的代码在数据库更新失败的时?“撤销”寚w列的操作。我们不提倡这样做。这U实现要比您最初的惌要复杂得多,q且q有许多其他的情况(惌一下如果应用程序在执行此操作的q程中突然崩溃的情况Q。作为替代的方式Q应该用两阶段提交事务。如果您使用 CMTQƈ且在一个单一?CMT 中访问两阶段提交的资源(例如 JMS 和大多数数据库)QWebSphere 会处理所有的复杂工作。它确保整个事务被执行或者都不被执行Q包括系l崩溃、数据库崩溃或其他的情况。其实现在事务日志中保存着事务状态。当应用E序讉K多种资源的时候,我们怎么使用 CMT 事务的必要性都不ؓq?/p>
只有在需要多U表C出类型,q且输出cd被一个单一的控制器及后端支持时才?XML/XSLT?/p>
我们常听C些争Qؓ什么您选择 XML/XSLT 而不?JSP 作ؓ表示层技术。选择 XML/XSLT 的h的观ҎQJSP“ 允许您将模型和视图合在一?#8221;Q?XML/XSLT 不会有这U问题。遗憄是,q种观点q不完全正确Q或者至不像白与黑那样分的清楚。实际上QXSL ?XPath 是编E语a。XSL 是图灵完成的QTuring-completeQ,管它不W合大多Ch定义的编E语aQ因为它是基于规则的Qƈ且不具备E序员习惯的控制工具?/p>
现在的问题是既然l予了这U灵zL,开发h员就会利用这U灵zL。尽每个h都认?JSP 使开发h员容易在视图中加?#8220;cM模型”的行为,而实际上Q在 XSL 中也有可能做Z些同L事情。尽从 XSL 中进行访问数据库q样的事情会非常困难Q但是我们曾l见到过一些异常复杂的 XSLT 样式表执行复杂的转换Q这实际上是模型代码?/p>
然而,应该选择 JSP 作ؓ首选的表示技术的最基本的原因是QJSP 是现在支持最q泛的、也是最被广泛理解的 J2EE 视图技术。而随着自定义标记库、JSTL ?JSP2.0 的新Ҏ的引入Q创?JSP 变得更加ҎQƈ且不需要Q?Java 代码Q以及可以将模型和视图清晰的分离开。在一些开发环境中Q如 WebSphere StudioQ加入了?JSPQ包括对调试的支持)的强大支持,q且许多开发h员发C?JSP q行开发要比?XLS 单,一些支?JSP 的图形设计工具及其他特征Q尤其在 JSF q样的框架下Q得开发h员可以以所见即所得的方式q行 JSP 的开发,而对?XSL 有时不容易做到?/p>
最后一个要谨慎考虑使用 JSP 的原因是速度问题。在 IBM 所作的Ҏ XSL ?JSP 相对速度的性能试昄Q在大多数情况下QJSP 在生成同L HTML 的时候,要比 XSL 快好几倍,甚至使用~译q的 XSL 也是如此。尽多数情况下q不是问题,但在性能要求很高的情况下Q这׃成ؓ问题?/p>
然而,q也不能_您永q也不要使用 XSL。在一些情况下QXSL 能够表示一l固定的数据Qƈ且可以基于不同的样式表来以不同的方式昄q些数据的能力是昄视图的最佌x案。然而,q只是一U例外的情况Q而不是通用的规则。如果您只是生成 HTML 来表达每一个页面,那么在大多数情况下,XSL 是一U不必要的技术,q且Q它l您的开发h员所带来的问题远比它所能解决的问题多?/p>
启用会话持久性?/p>
HttpSessions 对于存储应用E序状态信息是非常有用的。其 API 易于使用和理解。遗憄是,开发h员常帔R忘了 HttpSession 的目的——用来保持暂时的用户状态。它不是L的数据缓存。我们已l见到过太多的系lؓ每个用户的会话放入了大量的数据(辑ֈ兆字节)。那好了Q如果同时有 1000 个登录系l的用户Q每个用h?1MB 的会话数据,那么需?1G 或者更多的内存用于q些会话。要使这?HTTP 会话数据较小一些,不然的话Q您的应用程序的性能会下降。一个大U比较合适的数据量应该是每个用户的会话数据在 2K-4K 之间Q这不是一个硬性的规则Q?K 仍然没有问题Q但是显然会?2K 时的速度要慢。一定要注意Q不要 HttpSession 变成数据堆积的场所?/p>
一个常见的问题是?HttpSession ~存一些很Ҏ再创建的信息Q如果有必要的话。由于会话是持久性的Q进行不必要的序列化以及写入数据是一U很奢侈的决定。相反地Q应该用内存中的哈希表来缓存数据,q且在会话中保存一个对此数据进行引用的关键字。这P如果不能成功d到另外的应用服务器的话,可以重新创建数据?/p>
当谈及会话持久性时Q不要忘记要启用q项功能。如果您没有启用会话持久性,或者服务器因ؓ某种原因停止了(服务器故障或正常的维护)Q则所有此应用服务的当前用L会话会丢失。这是g令h非常不高兴的事情。用户不得不重新dQƈ且重新做一些他们曾l已l做q的事情。相反地Q如果启用了会话持久性,WebSphere 会自动将用户Q以及他们的会话Q移到另外一个应用服务器上去。用L至不知道会有q种事情的发生。我们曾l见到过一些品系l因为存在于本地代码中o人难以忍受的 bugQ不?IBM 的代码!Q而突然崩溃的情况Q这q种情况下,上述功能仍然可以q行良好?/p>
通过使用q些功能Q系l性能可以得到很大的提高,而开销是很的。ƈ且不影响~程模型?/p>
通过~存来提高性能的好处是众所周知的事情。遗憄是,当前?J2EE 规范没有包括一U用?servlet/JSP ~存的机制。然而,WebSphere 提供了对面以及片断~存的支持,q种支持是通过其动态缓存功能来实现的,q且不需要对应用E序作出M改变。其~存的策略是声明性的Q而且光|是通过 XML 配置描述W来实现的。因此,您的应用E序不会受到影响Qƈ保持?J2EE 规范的兼Ҏ和UL性,同时q从 WebSphere ?servlet ?JSP 的缓存机制中得到性能的优化?/p>
?servet ?JSP 的动态缓存机制得到的性能的提高是显而易见的Q这取决于应用程序的Ҏ。Cox ?Martin [Cox] 指出对一个现有的 RDFQ资源描q格式)站点摘要 (RSS)servletQ当使用动态缓存时Q其性能可以提高 10%。请注意q个实验只涉及到一个简单的 servletQ这个性能的增镉K可能q不能反映一个复杂的应用E序?/p>
Z更多地提高性能Q将 WebSphere servlet/JSP l果~存?WebSphere 插g ESI Fragment 处理器、IBM HTTP Server Fast Response Cache Accelerator (FRCA) ?Edge Server ~存功能集成在一赗对于繁重的Zd的工作负P通过使用q些功能可以得到许多额外的好处?/p>
通过 WebSphere 框架Qreadahead、缓存、隔ȝ别等Q优化性能。如果可能,有选择的应用一些模式来辑ֈ提高性能的目的,例如 Fast-Lane 阅读?[Marinescu]?/p>
对象/关系QO/RQ映是使用 Java 创徏企业U的应用E序的基。几乎每?J2EE 应用E序都需要一些类型的 O/R 映射。J2EE 厂商提供一U?O/R 映射机制Q这U机制在不同的厂商间是可UL的,高效的,q且能够被一些标准及工具很好地支持。这是 EJB 规范中的 CMPQ容器管理的持久性)部分?/p>
早期?CMP 实现以表C佛_不支持许?SQL l构而著U。然而,随着 EJB 2.0 ?2.1 规范的出玎ͼ以及被一些厂商所采纳Qƈ且随着?IBM WebSphere Studio Application Developer 的出玎ͼq些问题已经不再是问题了?/p>
CMP EJB lg现在已经被广泛地应用于许多高性能的应用程序中。WebSphere 包括一些优化功能以提高 EJB lg的性能Q优化功能包括:对生命周期的~存?read-ahead 能力。这两者优化功能都是配|时的选项Qƈ且不需要对应用E序q行修改或者媄响可UL性?/p>
处于~存状态的生命周期~存 CMP 状态数据ƈ提供Z旉的无效性。从处于~存状态的生命周期得到的性能提高可以辑ֈ选项 A 的缓存性能Qƈ且仍然可以ؓ您的应用E序提供可展性。Read-ahead 能力和容器管理的关系l合使用。这个特性通过在相同的查询中随意地索相关的数据作ؓ父数据而减与数据库的交互。如果相关的数据要通过使用q发的查询来讉K的话Q这U方法可以得到性能的改q。[Gunther]提供了详l的描述以及通过q些Ҏ得到的性能提高的细节?/p>
此外Qؓ了完全优化您?EJB lgQ当指定隔离U别时要特别注意。尽可能使用最低的隔离U别Qƈ且仍然保持您的数据的完整性。较低的隔离U别可以提供最佳的性能Qƈ且可以降低出现数据库死锁的危险?/p>
q是目前最有争议的最佛_c已l有大量的文章赞?CMP EJBQ同L贬斥C不绝于耟뀂然而,q里最基本的问题是数据库开发是困难的。当您开始用Q何持久性解x案之前,您需要掌握查询以及数据库锁定如何工作q些基础知识。如果您选择使用 CMP EJBQ您要确保您已经通过一些书c(例如 [Brown] ?[Barcia]Q知道如何用它们。在锁定及争用方面有一些微妙的交互难以理解Q但是,在您耗费一定的旉及努力后会将其掌握的?/p>
在这个简短的摘要中,我们已经向您介绍?J2EE 中的核心模式和最佛_践,q?J2EE 开发成ZU可理的过E。尽我们ƈ没有l出所有在实践中用这些模式的必要l节Q但是我们希望能够给您够的指点和指|以帮助您军_下一步要做什么?/p>
1. 始终使用 MVC 框架?/strong>
MVC 框架可以业务逻辑QJava beans ?EJB lg)、控制器逻辑QServlets/Struts 动作Q、表C层QJSP、XML/XSLTQ清晰地分离开来。良好的分层可以带来许多好处?/p>
2. 在应用程序的每一层都使用自动单元试和测试管理?/strong>
不要只是试您的囑Ş用户界面QGUI)。分层的试使测试及l护工作变得极其单?/p>
3. 按照规范来进行开发,而不是按照应用服务器来进行开发?br />
要将规范熟记于心Q如果要背离规范Q要l过慎密的考虑后才可以q样做。这是因为当您背规则的时候,您所做的事情往往q不是您应该做的事情?/p>
4. 从一开始就计划使用 J2EE 安全性?/strong>
启用 WebSphere 安全性。这使您?EJB ?URL 臛_可以让所有授权用戯问。不要问Z么——照着做就是了?/p>
5. 创徏您所知道的?/strong>
6. 当?EJB lgӞ始终使用会话 Facades?/strong>
决不要将实体 bean 直接暴露lQ何用L型。对实体 bean 只可以用本?EJB 接口QLocal EJB interfacesQ?/p>
7. 使用无状态会?beanQ而不是有状态会?bean?/strong>
q样做可以您的pȝl得起错误的l止。?HttpSession 存储和用L关的状态?/p>
8. 使用容器理的事务?/strong>
9. ?JSP 作ؓ表示层的首选?/strong>
10. 当?HttpSession Ӟ量只将当前事务所需要的状态保存其中,其他内容不要保存?HttpSession 中?/strong>
11. ?WebSphere 中,使用动态缓存,q?WebSphere servlet ~存机制.
12. Z提高E序员的工作效率Q将 CMP 实体 bean 作ؓ O/R 映射的首选解x?
l束?/strong>