?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
来多人开始用Java,但是他们大多Ch没有做好_的思想准备(没有接受OO思想体系相关培训)Q以致不能很好驾驭Java目Q甚臛_致开发后的Javapȝ性能~慢甚至l常当机。很多h觉得q是Java复杂DQ其实根本原因在于:我们原先掌握的关于Y件知?OO斚w)不是太乏就是不恰当Q存在认识上和方法上的误区?/p>
软g的生命?/p>
软g是有生命的,q可能是老调重弹了,但是因ؓ它事兛_层架构的原由Q反复强调都不过分?/p>
一个有生命的Y仉先必L一个灵zd扩展的基架构Q其ơ才是完整的功能?/p>
目前很多人对软g的思想q是焦点落在后者:完整的功能,觉得一个Y件功能越完整好Q其实关键还是架构的灉|性,是前者,基础架构好,功能d只是旉和工作量问题Q但是如果架构不好,功能再完_也不可能包括未来所有功能,软g是有生命的,在未来成长时Q更多功能需要加入,但是因ؓ基础架构不灵zM能方便加入,死\一条?/p>
正因为普通h对Y件存在短视误区,对功能追求高于基架构Q很多吃了亏的老程序员此d软g行业Q带走宝늚p|l验Q新的盲目的q轻E序员还是用老的思维往前冲。其实很多国外免费开源框架如ofbiz compiere和slide也存在这斚w陷阱Q貌似非常符合胃口,其实cM国内那些几百元的盗版软gQ扩展性以及持l发展性严重不?/p>
那么选择现在一些流行的框架如Hibernate、Spring/Jdonframework是否pC基架构打好了呢Q其实还不尽Ӟ关键q是取决于你如何使用q些框架来搭Z的业务系l?/p>
存储q程和复杂SQL语句的陷?/p>
首先谈谈存储q程使用的误区,使用存储q程架构的h以ؓ可以解决性能问题Q其实它正是D性能问题的罪祸首之一Q打个比喻:如果一个h频MQ打一针可以让其g长半q_但是打了q针Q其他所有医疗方案就全部失效Q请问你会用这U短视方案吗Q?/p>
Z么这栯呢?如果存储q程都封装了业务q程Q那么运行负载都集中在数据库端,要中间J2EE应用服务器干什么?要中间服务器的分布式计算和集能力做什么?只能回到q去集中式数据库L时代。现在Y仉是面向互联网的,不象q去那样局限在一个小局域网Q多用户q发讉K量都是无法确定和衡量Q依靠一台数据库L昄是不能够承受q样恶劣的用戯问环境的?当然搞数据库集群也只是五十步和百步的区别)?/p>
从分层角度来看,现在三层架构Q表现层、业务层和持久层Q三个层ơ应该分割明显,职责分明Q持久层职责持久化保存业务模型对象,业务层对持久层的调用只是帮助我们ȀzLl委托其保管的对象,所以,不能因ؓ持久层是保管者,我们׃其ؓ核心围绕其编E,除了要求其归q模型对象外Q还要求其做其做复杂的业务组合。打个比喻:你在火R站将水果和盘子两个对象委托保处保管Q过了两天来取时Q你q要求保处水果去皮切成块Q放在盘子里Q做成水果盘l你Q合理吗Q?/p>
上面是谈q分依赖持久层的一个现象,q有一个正好相反现象,持久层散发出来,开始挤占业务层Q腐蚀业务层,整个业务层到处看见的是数据表的媄?包括数据表的字段)Q而不是业务对象。这L序员应该多看看OOl典PoEAA.PoEAA 认ؓ除了持久层,不应该在其他地方看到数据表或表字D名?/p>
当然适量使用存储q程Q用数据库优点也是允许的。按照Evans DDD理论Q可以将SQL语句和存储过E作则Specification一部分?/p>
Hibernate{ORM问题
现在使用HibernateZ不少Q但是他们发现Hibernate性能~慢Q所以寻求解x案,其实q不是Hibernate性能~慢Q而是我们使用方式发生错误Q?/p>
"最q本人正搞一个项目,目中我们用Cstruts1.2+hibernate3, ׃关系复杂表和表之间的关系很多Q在很多地方把lazy都设|false,所以导致数据一加蝲很慢Q而且查询一条数据更是非常的慢?quot;
Hibernate是一个基于对象模型持久化的技术,因此Q关键是我们需要设计出高质量的对象模型Q遵循DDD领域建模原则Q减降低关联,通过分层{有效办法处理关联。如果采取围l数据表q行设计~程Q加上表之间关系复杂(没有U学Ҏ处理、侦察或减少q些关系)Q必然导?pȝq行~慢Q其实同样问题也适用于当初对EJB的实体Bean的CMP抱怨上Q实体Bean是Domain Model持久化,如果不首先设计Domain Model,而是设计数据表,和持久化工具设计目标背道而驰Q能不出问题吗?关于q个问题N多年在Jdon争论q?/p>
q里同样延出另外一个问题:数据库设计问题,数据库是否需要在目开始设计?
如果我们q行数据库设计,那么׃生了一pd问题Q当我们使用Hibernate实现持久保存Ӟ必须考虑事先设计好的数据库表l构以及他们的关pd何和业务对象实现映射Q这实际上是非常隑֮现的Q这也是很多得用ORM框架手Ҏ原因所在?/p>
当然Q也有脑力相当发辄人可以实玎ͼ但是q种围绕数据库实现映的l果必然扭曲业务对象Q这cM于两个板?数据表和业务对象)相撞Q必然生地震,地震的结果是两|׃QY的一方吃亏,业务对象是代码,相当于数据表l构Q属于Y的一方,最后导致业务对象变成数据传输对象DTO, DTO满天飞,性能和维护问题随之而来?/p>
领域建模解决了上qC多不协调问题Q特别是ORM痛苦使用问题Q关于ORM/Hibernate使用q是那句老话Q如果你不掌握领域徏模方法,那么׃要用Hibernate,对于q个层次的你Q也许No ORM 更是一个简单之道:No ORM: The simplest solution
Spring分层矛盾问题
Spring是以挑战EJB面貌出现Q其本n拥有的强大组件定制功能是优点Q但是存在实战的一些问题,Spring作ؓ业务层框Ӟ不支持业务层Session 功能?/p>
具体举例如下Q当我们实现购物车之cM务功能时Q需要将购物场合保存到Session中,׃业务层没有方便的Session支持Q我们只得将购物车保存到HttpSession,而HttpSession只有通过HttpRequest才能获得Q再因ؓ在Spring业务层容器中是无法访问到HttpRequestq个对象的,所以,最后我们只能将"购物车保存到HttpSession"q个功能攑֜表现层中实现Q而这个功能明昑ֺ该属于业务层功能Q这导致我们的Java目层次混ؕQ维护性差?q背了用Spring和分层架构最初目的?/p>
领域驱动设计DDD
现在回到我们讨论的重点上来,分层架构是我们用Java的根本原因之一Q域建模专家Eric Evans在他?quot;Domain Model Design"一书中开首先强调的是分层架构,整个DDD理论实际是告诉我们如何用模型对象oo技术和分层架构来设计实C个Java目?/p>
南软g开?/strong>现在很多人知道Java目基本有三层:表现?业务层和持久层,当我们执着于讨论各层框架如何选择之时Q实际上我们真正的项目开发工作还没有开始,是我们选定了某U框架的l合(如Struts+Spring+Hibernate或Struts+EJB或Struts+ JdonFramework)Q我们还没有意识C务层工作q需要大量工作,DDD提供了在业务层中再划分新的层ơ思想Q如领域层和服务层,甚至再细分ؓ作业层、能力层、策略层{等。通过层次l化方式辑ֈ复杂软g的松耦合。DDD提供了如何细分层ơ的方式
当我们将_֊p在架构技术层面的讨论和研I上Ӟ我们可能忘记以何U依据选择q些架构技术?选择标准是什么?领域驱动设计DDD 回答了这L问题QDDD会告诉你如果一个框架不能协助你实现分层架构Q那抛弃它Q同ӞDDD也指出选择框架的考虑目的Q得你不会Z亦云Q陷入复杂的技术细节迷雾中Q迷׃架构选择的根本方向?/p>
现在也有些h误以为DDD是一U新的理论,其实DDD和设计模式一P不是一U新的理论,而是实战l验的ȝQ它前?使用面向模型设计的方法经验提炼出来,供后来者学习,以便q速找到驾驭我们Y仉目的Ҏ之道?/p>