<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/j2ee-project-infact-app-know/</link>
<title><![CDATA[J2EE项目实际应用中的一点体会]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Sun, 26 Sep 2010 08:45:24 +0000</pubDate> 
<guid>https://www.heckjj.com/j2ee-project-infact-app-know/</guid> 
<description>
<![CDATA[ 
	<span style="font-family: 微软雅黑;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、认真考虑是否真要使用j2ee<br/><br/>　　这个很重要，非常重要。j2ee涵盖的内容大而全，但很多不一定就是具体实际项目需要的。象ejb级的权限控制，如果你的表现层(大部分项目就是web server)和应用服务器不存在信任问题，那么基本上就不用考虑。又比如伸缩性，如果同时在线最多不超过100个，就没什么用处。针对项目的实际情况选择效费比最合适的解决方案，而不要为了应用先进技术而应用先进技术。<br/><br/>　　2、选择合适的分布模型<br/><br/>　　提起分布，很多人可能都会有这样的设想：server a处理认证，server b处理订单，server c处理仓储;如果b的负载太大，那么再细分一下：录入、修改部分的ejb部署在server d，统计、分析部分的部署在server e，等等。其实没有必要，我的体会是：除非业务必须(如分支机构统一通过总部的app server来进行权限验证)，否则最好将所有的应用全部放在一个app server中，能在一个进程空间内更好(使用home interface)，然后进行平行的分布?d?d即集群中的所有app server功能上都是等价的。相比前一种垂直(或者网状)分布，平行分布的可靠性、容错能力、伸缩能力都要更好，同时减少了部署、管理负担。最重要的是，减少了因为业务逻辑层内部跨进程调用引起的开销，提高了整体性能。然而，如果a、一些业务逻辑必须相互独立部署、管理，b、负载较为集中地分布在若干个ejb中，那么，垂直分布还是必不可少的。<br/><br/>　　3、为entity bean选择合适的数据存储方案<br/><br/>　　首先尽量使用cmp管理数据存储，尤其是简单的，大部分业务操作都是插入删除修改的实体，不然光insert update就够你忙的了，更不用说数据库移植问题。其次对于简单的一对一、一对多关系，如果你的app server没有实现ejb2.0规范，可以考虑使用o/r映射工具帮助开发，象cocobase， ejb creator等等，可以提高不少效率。对于复杂的对象存储，没办法，老老实实写代码吧……</span><span style="font-family: 微软雅黑;"> <br/><br/>　　4、慎重考虑ejbhome.findbyxxx()，listxxx()的实现<br/><br/>　　设想对一个百万记录级的表进行检索，结果集很可能是上万条、十万条，这本身就是一个耗费资源的过程;同时对于检索到的每一个记录还要做一次findbyprimarykey，这么多次跨进程调用，开销可想而知。为什么有的人觉得用j2ee实现的程序奇慢无比，缺乏仔细的设计就是主要原因之一。<br/><br/>　　5、使用抽象数据结构传递数据<br/><br/>　　例如，listorder()返回collection而不是vector，insertitems()也是以collection为参数而不是linkedlist.当然这个实际上与j2ee本身关系不是很大。<br/><br/>　　6、对entity bean尽量使用map来存储、传递属性<br/><br/>　　对业务流程没有很大影响的属性，象身高体重出生年月之类，最好用一个hashmap来存放，而不要直接用成员变量+getxxx/setxxx.对于ejbcreate也是一样，十几个参数的create方法，实现、维护都是代价高昂的。需知实际应用中这些字段的增减、属性变化是家常便饭，光维护get/set方法可能就会让你吐血了。但是，对于对业务流程有关建意义的字段，例如员工的入职日期决定其休假天数的计算，那么还是作为成员变量的好。<br/><br/>　　7、分清entity bean和session bean的职责<br/><br/>　　entity bean是实体的对象形式，它的职责应限于自身的存储，以及对外部提供访问内部数据的接口(所以我认为它本质上应该属于数据存储层)。entity bean应该尽量避免自己实现有其他entity bean参与的业务逻辑。例如，订单的货款收到以后，将订单的状态由“提交”变为“生效”，同时将订单的金额按照某种规则折算成该客户的积分。这个业务流程有三个对象参与：客户，订单和积分折算策略。那么，实现流程的方法应该在哪个对象中呢，是客户还是订单?都不合适，如果在订单中，那么订单对象需要了解客户积分属性的接口及积分折算的接口;如果在客户对象中也是一样。耦合度增强就意味着维护难度增大，如果用户对象的积分接口或者折算策略的接口改变了，那么改变就会蔓延到订单对象中。合适的方式是用一个orderprocessor来管理订单处理流程，以stateless session bean来实现。orderprocessor了解所有参与订单处理的对象的接口，它集中管理对订单的处理流程，如果流程发生变化，订单生效之前要通过审批，这种变化不会影响到参与流程的实体对象;同样，参与流程的某个对象接口发生了变化，也不会影响到其他对象<br/><br/>8、重视表现层的复用<br/><br/>　　企业软件的界面，大部分都可以用一些基本元素如grid， tree， page control， form等组合而来。如果能合理采用一些技术对这些元素进行复用，不但有利于降低开发成本，而且也便于统一维护界面风格。对j2ee的表现层，也就是jsp/servlet，可以采用的复用技术不多，基本上就是文件包含、创建类库、tag lig(本质上还是创建类库，使用起来我觉得还不一定有直接方法调用来的方便)等等。还有一些不同于jsp/servlet的表现层框架，如apache velocity、enhydra、webmacro等等，也可以参考。虽然java还没有一个规范的、统一的html界面元素类库，但自己项目内部统一使用某种方案还是可能的。<br/><br/>　　另外，xml+xslt也是一种方案。将数据直接用xml形式表现出来，绕过entity bean，然后再用xslt模版转化成最终界面。xml与xslt之间属于模式匹配式的松散耦合，可以避免强类型语言方法调用带来的参数类型、个数、顺序限制，做到彻底地数据与界面分离;同时xml形式的数据集在app server中可以按照合适的方案进行缓冲，避免频繁访问数据库，抵销xslt转换引入的性能负担。同时xml和xslt是业界广泛采纳的标准，如果今后采用不同的体系结构(如从j2ee移植到。net或者相反)，表现层的xslt形式的界面可以重用。jsp或asp就没有这种可能。问题在于首先要管理关系型数据到层次型xml数据的映射，其次如果没有一个好的工具，创建、维护xslt也是很费时费力的事情。我现在的项目正在朝这个方向努力，希望能做一个象delphi那样好用的，基于xslt的html界面控件开发、管理、使用环境。<br/><br/>　　9、充分估计开发的艰辛程度<br/><br/>　　这个，一言难尽。总之实际需求的变化往往是超乎我们想象的，要在需求分析结束的时候就清晰划分模块接口几乎做不到，计划不如变化。而j2ee体系架构是重量级的框架，虽然app server实现了很多功能，但同时也要求你开发的时候付出额外的代价。对于j2ee项目的资金、时间、人手等资源估计，宁可多不可少，千万不要简单认为用了一个weblogic就万事大吉了。</span><br/>Tags - <a href="https://www.heckjj.com/tags/j2ee%25E9%25A1%25B9%25E7%259B%25AE/" rel="tag">j2ee项目</a> , <a href="https://www.heckjj.com/tags/%25E5%25AE%259E%25E9%2599%2585%25E5%25BA%2594%25E7%2594%25A8/" rel="tag">实际应用</a> , <a href="https://www.heckjj.com/tags/%25E4%25BD%2593%25E4%25BC%259A/" rel="tag">体会</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/j2ee-project-infact-app-know/#blogcomment</link>
<title><![CDATA[[评论] J2EE项目实际应用中的一点体会]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/j2ee-project-infact-app-know/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>