`
marszgl
  • 浏览: 53758 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

开发J2EE应用程序应遵循的几点基本原则

阅读更多
J2EE,作为开发mission-critical的企业级应用的一整套规范的整合平台,规范多、内容广,从而给开发J2EE应用带来了很多“麻烦”。比如,为实现内容的RDBMS存储,我们可能的方法有JDBC、Entity Beans、JDO、O/R Mapping工具(TopLink、Hibernate)、XML-DBMS、JAXB等方法(其中一些方法不是J2EE规范所包含的)。因此,为实现J2EE各层(至少有表示层、控制层、商业逻辑层等3层)以及层与层之间的耦合,J2EE系统架构师需要考虑的问题会很多。加上,J2EE本身的快速发展,给架构、开发具有工业强度的J2EE应用带来一些难题。


同时,软件开发技术从来就没有“银弹”,所以J2EE技术也不是万能的。但是,如果我们在结合具体商业需求的基础上,合理的应用好J2EE技术,其结果可想而知。本文试图从本人以往的项目经验入手,来探讨开发J2EE应用时应该遵循的几点准则,希望起到抛砖引玉的作用。本文结合JBoss 3.2.1下的J2EE应用开发为例展开论述。


1. 结合商业需求选择合理的架构


如果脱离商业需求,而单独的讨论技术本身的优势是不够的。各项技术都有产生的特定背景,其中很多都是来自工业需求而触动的。一般而言,企业信息系统(EIS)都要求自己稳定、安全、可靠、高效、便于维护。同时,各个企业信息系统都有自己独特的要求,可能有些时候需要考虑与原有遗留系统的集成,所以了解各个企业信息系统具体的商业需求对于整个系统的架构显得很关键。


比如,如果待开发的J2EE应用系统中使用到的数据大部分来自于外在数据源;而这些数据可能是通过JDBC直接从外在数据源导入到待开发的J2EE系统的Database中。对于这种情形,如果在开发过程中,仅仅使用JDBC来操作数据库,对于小强度(并发访问用户少、数据流量少)的情形,显然是比较合适的;但如果,并发访问用户较多、数据流量大,对Database层使用较为频繁的情形,则显得有些力不从心。因此,对于这种需求,我们可以考虑采用Entity Beans with Caches。打个比方,在JBoss 3.2.1中对于Entity Beans的Cache策略有多种,这时可以考虑使用,,即“Standard CMP 2.x EntityBean”,方式并采用“D”类型的commit-option来保证Entity Beans的内容与数据源的同步,并使得系统的性能得到大大改善(同直接使用JDBC相比)。其中,可以将一些Entity Beans设置为read-only,以改善性能。当然,在这里也可以采用其他一些O/R Mapping技术,比如TopLink。


再比如,考虑这样一种情形:如果待开发的企业信息系统使用到的数据都是由系统本身生成和操作的,则建议采用:CMP Entity Beans技术。Entity Beans给大家的印象很坏,这可能与EJB 1.1给大家留下的坏映象有关吧。但是,EJB 2.0(或者说2.1)得到了很大的改善,Local Interfaces、CMR、Read-Only、Session Fa?ade模式给Entity Beans注入了活力。当然,并发用户多、数据流量很大时才会体现出使用Entity Beans的优势。其中,有一点很关键:要注重Entity Beans技术的性能调优,各个应用服务器都有自己的一套性能调优方案。对于JBoss 3.2.1,配置文件standardjboss.xml提供了Entity Beans技术调优的入口。比如,Bean Lock策略的合理使用对于Entity Beans的调优就显得很重要。这样使得,我们可以更加关注于系统的商业逻辑,而不只是底层的Database(EJB调优处于EJB Container中,因此我们处在J2EE性能的高端,而不是底端,即Database层。同时,Database层的调优使得J2EE系统的数据库移植性大打折扣。)。


简而言之,要结合各个系统的特定需求和状况给出具体的技术架构方案,而不能孤单的论述技术本身的好坏。


2. Framework的合理选用


设计模式在J2EE应用系统中扮演着重要的角色。因此,有一个问题摆在大家面前,是自己来实现具体的设计模式,还是借助于Third-party Framework。如果贵公司不大,或者说公司不想在J2EE基础应用Framework投入很多精力,选用现有的较为成熟的、稳定、与现有J2EE Specification兼容的技术框架会比较明智。


一般而言,Framework本身,或者说J2EE平台本身都是实现并优化了具体的设计模式、规则,比如业务代理、Service Locator(包括Web Tier和EJB Tier各自的服务定位器,起到统一管理有限资源、Cache相关资源的作用,便于系统移植)、Front Controller、DAO等等。现有的J2EE Framework比较丰富。比如:


Struts: 对于实现了Model 2类型的Framework,对于现在以及将来(随着JSF规范、技术的成熟),选用她是一种明智之举。目前,Struts已经发展到1.1版本。其内在的MVC主线、对后端数据操作方式没有限定、集合了Apache Jakarta项目组的优秀相关项目的精华,可谓是开发J2EE应用的佳品。同时,对于具有.NET Web Forms功能的下一代J2EE平台技术JSF而言,Struts本身可考虑到与JSF的兼容和集成性。比如,通过JSP呈现表示层、Servlet呈现控制层、EJB呈现数据存储层。各层之间,可以通过值对象、HTTP相关对象来通讯,实现J2EE相关技术的完美应用。


Log4j: 我想对于习惯采用“System.out.println("");”的读者而言,Log4j是大家的福音。尽管Java 2 Standard Edition也具备java.util.logging包来保证日志的输出,但Log4j的简单、高效、灵活已经成了很多项目的选择。日志,在某种程度上可以考验系统的稳定性、正确性,所以采用可配置的Log4j(目前,Log4j已经考虑到了与java.util.logging包的兼容性)是不会错的。比如,JBoss 3.2.1本身就是借助于Log4j来管理日志的。


realMethods: 可能有些读者还不知道这一款杀手锏。那好,这里就简要作一介绍。realMethods是一开发J2EE应用的Framework,她不同于Struts(主要在于实现Model 2,J2EE应用前端);realMethods对于J2EE应用的各个层面都有详尽、高效的支持。同时,realMethods以前还是商用软件,现在已经成为了Open Source的产品,因此现在可以参看其全部源代码。


BC4J: Oracle公司推出的用于Java的商业组件。其内容和外在的特点和优势,不言而喻。


当然,类似的Framework很多很多。作为开发J2EE应用的团队而言,我们需要对各种Framework加以筛选,选择适合项目需求、团队、公司发展方向的框架。


一般情况下,待开发的目标产品不宜采用过多的Framework。其一,J2EE各个技术发展很快,过多的Framework使得系统的后续升级、维护不利;其二,可以借鉴其中的好的一面,比如研究realMethods实现的相应的设计模式,并改造她以适合我们的项目需求;其三,Framework本身会有变动,如果选用过多,会给开发团队加重负担,从而不利于项目管理。有选择的使用现有的成熟Framework能提升大家的开发效率、开发水平。


3. 开发模式的选择


开发J2EE应用要求目标开发人员能够掌握其中的各种技术。但是,现实情况不是这样。作为一个团队,每个人都有自己不同的技能优势、兴趣以及悟性。同时,J2EE本身需要体现社会分工。一般情况下,我们的开发团队不会有Specification所要求的各个开发角色。现实往往只有3种(也可能是两种):美工、JSP程序员、EJB程序员。面对这种分工,团队更要注重沟通、交流,注重代码的一致性。


一般情况下,团队要尽量采用版本控制工具管理代码、尽量做到每天都有一个完整的运行版本。经过一段时间,团队都会适应这种开发模式。其中,版本控制工具一定要使用,便于代码的管理、控制和备份。这其中会牵扯到很多层面。比如,开发工具的选择要考虑到版本控制工具的使用、建模工具的合理使用有助于团队有效的沟通和交流。


基于现有的开发模式,个人认为这样3套方案不错。第一,采用Together作为建模工具、采用JBuilder作为IDE工具、采用VSS(或者CVS)作为版本控制工具、采用JBoss作为开发J2EE应用开发阶段的服务器。第二,采用WebSphere Studio整套工具。第三,采用Eclipse(或者JCreator)、Ant、XDoclets作为开发工具。


当然,手工完成J2EE应用的编写、编译、打包、部署、测试更能使开发者理解各个开发阶段的具体细节。但本人认为,只要开发者有这种关注具体细节的态度,选用功能强大的建模、开发工具是明智的。开发工具不能提高开发人员的开发技能,但是她能够引导开发人员正确的开发方向。比如,JBuidler 9 Enterprise提供的EJB精灵具有的“Struts + EJB + Session Fa?ade + Value Object”等功能呈现了业界广泛应用的J2EE构架方式。


4. 注重各个阶段的测试工作


测试工作往往是很多项目经理忽视,不愿意去花费时间、费用的内容,因为那样会增加项目的成本。但是,他们忽视了,项目的完成质量往往对项目的成本有很大的关系。比如,如果软件质量很差,并没有经历测试阶段,其后期部署、运行所带来的费用会远远超过前期的费用。


测试是分阶段的。单元测试,比如借助于JUnit,来保证功能正确等内容。集成测试,来保证系统没有内存泄漏等内容。其中,Optimizeite Suite Enterprise对于完成Profiler、Code Coverage、Thread Debugger等内容很有帮助。我记得,我写的一个Swing桌面应用存在内容泄漏,但是想了很多办法都没有解决问题。后来,采用Profiler获得了答案。因此,现在开发应用,我们很多时候都采用Optimizeite Suite Enterprise作为测试工具。尤其是,在做集成测试过程中,检查系统的内存泄漏、性能很有帮助。


测试是分类型的。压力测试、性能测试。就目前对支持J2EE应用的测试而言,并没有很好的测试工具。但是,一般情况下,借助于Rational Robot也能够取得不错的效果。

对于J2EE,我们知道当开发应用时,在架构设计阶段的决定将对应用的性能和可扩展性产生深远的影响。现在当开发一个应用项目时,我们越来越多地注意到了性能和可扩展性的问题。应用性能的问题比应用功能的不丰富问题往往更为严重,前者会影响到所有用户,而后者只会影响到碰巧使用该功能的那些用户。作为应用系统的负责人,一直被要求"要少花钱多办事"----用更少的硬件,更少的网络带宽,以及更短的时间完成更多的任务。J2EE通过提供组件方式和通用的中间件服务是目前首选的最优方式。而要能够构建一个具有高性能和可扩展性的J2EE应用,需要遵循一些基本的架构策略。
缓存(Caching)简单地说,缓存中存放着频繁访问的数据,在应用的整个生命周期中,这些数据存放在持久性存储器或存放在内存中。在实际环境中,典型的现象是在分布式系统中每个JVM中有一个缓存的实例或者在多个JVM中有一个缓存的实例。缓存数据是通过避免访问持久性存储器来提高性能的,否则会导致过多的磁盘访问和过于频繁网络数据传输。
复制复制是通过在多台物理机器上创建指定应用服务的多个拷贝来获得整体更大吞吐效率。理论上看,如果一个服务被复制成两个服务,那么系统将可处理两倍的请求。复制是通过单一服务的多个实例的方式从而减少每个服务的负载来提高性能的。
并行处理并行处理将一个任务分解为更为简单的子任务,并能够同时在不同的线程中执行。并行处理是通过利用J2EE层执行模式的多线程和多CPU特点来提高性能。与使用一个线程或CPU处理任务相比,以并行方式处理多个子任务可以使操作系统在多个线程或处理器中进行分配这些子任务。
异步处理应用功能通常被设计为同步或串行方式。异步处理只处理那些非常重要的任务部分,然后将控制立即返回给调用者,其他任务部分将在稍后执行。异步处理是通过缩短那些在将控制返回给用户之前必须处理的时间来提高性能的。虽然都做同样多的事情,但是用户不必等到整个过程完成就可以继续发出请求了。
资源池资源池技术使用的是一套准备好的资源。与在请求和资源之间维持1:1的关系的不同,这些资源可被所有请求所共享。资源池的使用是有条件的,需要衡量下面两种方式的代价:A、维持一套可被所有请求共享资源的代价B、为每个请求都重新创建一个资源的代价当前者小于后者时,使用资源池才是有效率的


当然,成功开发J2EE应用的因素有很多。比如,Entity Beans的成功应用很大程度上与底层Database的设计有关系(如果表结构设计设计的不合理,将导致Entity Beans性能的急剧下降);如何最大化挖掘、提升团队各个成员的J2EE技能。等等这些,设计面很广。
分享到:
评论

相关推荐

    j2ee核心模式 j2ee平台里模式的应用

    6. **前端控制器(Front Controller)**:在J2EE应用中,一个全局控制器(如Servlet)处理所有请求,负责调度到适当的处理程序,提供统一的入口点。 7. **服务定位器模式**:用于查找和管理服务的机制,帮助解耦...

    J2EE开发最佳实践

    在J2EE(Java EE,即Java平台企业版)开发中,遵循最佳实践至关重要,因为它们可以帮助提升应用程序的性能、可维护性和可扩展性。以下是根据提供的内容所提炼的几个核心知识点: 1. **始终使用MVC模式** MVC...

    J2EE Architecting and Designing

    本文档主要讲述了如何设计和构建高质量的J2EE应用程序,并提供了详细的指导原则和技术建议。 ### 二、J2EE架构的关键组件 #### 1. **容器(Container)** J2EE架构的核心在于容器的概念。容器负责管理应用程序组件的...

    J2EE项目开发Excel导入导出操作组件源代码

    这样的设计遵循了软件工程中的模块化和低耦合原则,提高了代码的可读性和可扩展性。 4. **源代码分析**: 这个组件可能包含以下几个关键部分: - **数据模型**:定义与Excel工作表对应的Java对象,通常包括getter...

    如何开发出一个高质量的J2EE系统

    在开发高质量的J2EE系统时,需要注意以下几点: - **模块化设计**:将系统划分为独立的模块,每个模块负责特定的功能,减少模块间的耦合。 - **分层架构**:通常采用表示层(Web层)、业务逻辑层(EJB或服务层)和...

    Java&J2EE性能优化文档

    在J2EE性能优化过程中,还应注意以下几点: 1. 避免在JSP页面中编写过多的Java代码,以减少页面渲染时间和复杂性。 2. 使用恰当的EJB版本,比如EJB 3.x引入了更轻量级的实体bean,简化了开发。 3. 考虑缓存策略,...

    j2ee Best Practice.pdf

    根据提供的文档内容,我们可以深入探讨J2EE最佳实践的关键知识点,包括其背景、目标、基本原则以及具体的实践案例。 ### J2EE 最佳实践简介 #### 什么是 J2EE 最佳实践? J2EE(Java 2 Platform, Enterprise ...

    比较全的J2EE教程

    J2EE,全称Java 2 Platform, Enterprise Edition,是Java平台的一个版本,专为构建企业级应用程序...通过系统学习,初学者可以逐步掌握J2EE开发所需的技能,进而在实际项目中应用这些知识,构建复杂的企业级应用程序。

    郭克华J2EE高级框架实战教学视频02

    在J2EE环境中,Struts可以帮助开发者更好地组织和控制应用程序的业务逻辑,减少视图与控制器之间的耦合,提高代码的可维护性和可扩展性。 在"02Struts简介.wmv"这个视频中,郭克华讲师可能详细介绍了以下几点内容:...

    J2EE核心模式_java

    7. **性能优化**:书中还讨论了J2EE应用的性能优化策略,如缓存、负载均衡、集群以及数据库查询优化等,这些都是保证系统高性能的关键因素。 8. **设计原则**:遵循SOLID原则(单一职责、开闭原则、里氏替换、接口...

    J2EE核心模式

    《J2EE核心模式》是一本深入探讨Java企业级应用开发的经典著作,它总结了在J2EE平台上构建可扩展、可维护、高效率应用程序的最佳实践。这些模式是基于大量实际开发经验提炼出来的,旨在帮助开发者理解并有效地解决在...

    Wrox.Expert.One-On-One.J2EE.Design.And.Development

    这部分强调了测试在软件开发生命周期中的重要性,并介绍了一些针对J2EE应用的有效测试策略和技术,如单元测试、集成测试和系统测试。具体内容包括: - 使用JUnit进行单元测试的方法。 - 对EJB和数据库交互的集成...

    Spring MVC大作业-J2EE-新闻管理系统

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)模式的 Web 应用程序。在 J2EE(Java 2 Platform, Enterprise Edition)环境中,Spring ...

    J2EE软件工程师求职手册

    ### J2EE软件工程师求职手册知识点汇总 #### 第一部分:求职过程篇 ##### 第1章:写在前面的话 - **程序员这个职业** - **职业感受**:介绍作为一名程序员的实际工作体验,包括日常工作内容、面临的挑战等。 - ...

Global site tag (gtag.js) - Google Analytics