banq,你好!回复如下:
一、我并没有因为对公司的好恶影响我对技术的判断。
坦白来说,我对MS和Sun全都没有好感,MS的垄断就不用说了,Sun的不思进取也让人不爽。我真正很有好感的公司是BEA,我个人希望BEA能够成为Java领域的旗手,而不是IBM。
二、理论和实践有一定差距
J2EE严守软件架构设计的理论,但实践执行起来,未免死板了一些。.net就灵活变通很多,很多地方的设计是不符合理论要求的,但是这样做就提高开发效率,带来很大的方便。
就好比关系数据库的设计,没有哪个DBA会严格遵守3个范式,总是会设计很多冗余字段,来提高查询效率。我对.net这样的方式持肯定态度。
三、j2ee和.net的比较
我曾花了很多功夫研究.net,从技术上来说.net没有任何优势可言,但是不要忘记,在IT发展历史中,技术先进的东西消亡,而技术落后的东西发展壮大的例子太多了。比如说IBM的OS/2 vs MS Windows,比如说DEC的Alpha vs Intel Xeon。对于两种技术的此消彼涨,更多的要取决于商业市场上的较力,赢得市场者赢得天下。再加上MS的老奸巨猾,.net总是一个让你不能忽视它存在的力量。
MS原来在企业开发领域是没有能够和j2ee相竞争的技术架构,但现在有了.net,.net融合了以往MS所有的技术成就,同时也吸取了很多j2ee的优点,我一直想写一遍文章详细的从技术和商业角度探讨两者的,这里不多谈了。
从技术角度来讲,我喜欢j2ee,不喜欢.net,因为Java语言非常严谨,让我享受到了软件设计的艺术美感,但从个人职业生涯来说,我宁愿做一个骑墙派,从商业角度来看问题,而不要因为个人的技术好恶影响我的判断。在一个具体项目中,从技术,从成本,从开发周期,从维护各个方面综合考虑,谁优就用谁。
四、可复用面向对象软件(模式)迄今为止,并不是非常成功。
请看Sun的《Core J2EE Pattern》这本书,我把中文版原话引用在这里:
“至今,我们追求软件重用的目标已经多年,但没有取得很大的成就。实际上,绝大多数业务重用的成功例子都发生在用户接口领域,而不是业务组件领域,而后者才是我们努力追求的目标。”
现在用java开发的框架已经非常广泛了,但是主要还是面向技术架构的框架,面向业务的框架确实很少有成功的,也许Ofbiz是一个?所以,业务改动太大的话,业务组件重用不了,还是得重新写。
特别是Internet开发,很多时候都是在需求不明确的情况下开发软件,一边根据用户反馈来调整需求,我以前在一个Internet公司做这样的开发做了一年半,在这样的情况下,你必须用快速原型开发,快速做一个Demo出来比考虑架构,重用重要的多。技术人员必须要有商业头脑才行,在商业目标优先的情况下,必须放弃自己的技术原则,牺牲软件性能,架构。这个问题不多谈了,社会意义太重,不适合在技术论坛讨论了。
五、CMP和Hibernate
CMP在进行O/R Mapping方面只是做了最基础的工作而已,完全用CMP做数据层,会发现你在把数据库应该做的工作全部都搬到App Server里面来重新实现一遍,有这必要吗?
CMP是把EJBQL写死在ejb-jar.xml里面的,所以n个条件就需要(c0n+c1n+...cnn )2的n次方个EJBFinder方法,简直没有办法说。
JDBC实现PrepareStatement的动态SQL构造不是不能够,而是非常麻烦,需要写一个非常非常大的if elseif else嵌套的判断。
Hibernate实现起来特别简单,(其实OJB也实现了PrepareStatement的动态SQL构造)这本身并不复杂,但是需要你多写些代码而已,由于CMP把EJBQL写死在配置文件里面了,你连选择的余地都没有。
六、O/R Mapping性能
我不知道为什么你这么怀疑O/R Mapping的性能,O/R Mapping的性能再差也比CMP强吧。
JDO只是一个标准,每个厂商实现的性能各有不同,不好评价。
Apache OJB的性能如何,Apache网站上面有评测。
Hibernate的性能我是花了点时间去研究的。Hibernate可以通过修改配置文件把所有的SQL语句都输出出来,你写一些测试代码观察一下输出的SQL,就什么都明白了。
简单的来说,Hibernate的性能比一个普通的Java程序员写的JDBC代码性能高非常非常多。原因是因为Hibernate本质上还是包装了JDBC来进行数据库操作的,由于Hibernate在调用JBDC上面是非常非常绞尽脑汁的优化JDBC调用,并且尽可能的使用最优化的,最高效的JDBC调用,所以性能相当令人满意。
简单来说吧,对于insert操作,普通JDBC程序员这样来写:
pstmt = conn.prepareStatement("insert into table1 values(?,?)");
for (int i=0; i< names.length; i++) {
pstmt.setString(1,names);
pstmt.setString(2,pass);
pstmt.executeUpdate();
}
如果批量插入n条记录的话,那么就是n次向数据库发送SQL语句。而Hibernate则是采用了JDBC2.0的batch功能。
for (int i=0; i< names.length; i++) {
pstmt.setString(1,names);
pstmt.setString(2,pass);
pstmt.addBatch();
}
pstmt.executeBatch();
只是1次向数据库发送SQL,性能高下判若分明。Update操作类似。
select操作,可以使用JCS缓冲查询结果,重复查询比JDBC肯定要快很多,分页操作使用JDBC2.0的scroll result。
另外Hibernate总是尽量延迟向数据发送SQL,它会先把SQL语句缓冲在Session的缓冲区里面,最后在flush的时候一次性的向数据库发送。
总体来说,当你使用Hibernate的时候,相当于有一个JDBC高手来帮你优化JDBC调用,那点封装了一层的损失可以忽略不计。
如果你非要认为Hibernate封装了JDBC会损失性能,那么我问你,Java设计的目标是组件可复用,这些不全都是封装吗?难到你调用组件都损失性能了,如果是那样,还不如不要写什么组件,全部都重新写原始的实现代码呢!
不过如果一个真正的JDBC高手,完全自己优化JDBC代码写DAO实现,我相信会比Hibernate性能高一些,但是Hibernate已经够优化了,你能够做的是非常有限的。就好比用C语言写的程序,虽然比汇编语言差一点,但是差的非常有限。Hibernate vs JDBC就相当于C vs Assemble,除非特殊需要,Hibernate已经足够好了。
不轻易相信别人的话,通过自己的思考和实践来判断,这种精神我很赞赏,我不会试图说服你非相信我的话不可,但我相信当你深入全面的研究和测试了Hibernate之后,会有一个满意的答案的。
七、正好相反,看看weblogic架构师http://www.theserverside.com/events/videos/DeanJacobs/transcription.html的发言,回答正好和这些BEA或IBM工程师相反
这个问题怎么说呢?其实你想过没有,BEA和IBM就是靠卖昂贵的能够跑EJB的App Server赚钱的,否则不早被那些便宜的开源的又不要钱的Java App Server取代了?如果他们的工程师敢在公开的场合宣传不要用EJB,他们是不是活得不耐烦了?还想不想在公司继续干下去了。我刚好在某行业No1的跨国大公司干过,明白一些大公司的内幕,呵呵,不继续说下去了。
to guty:
1、试试Java Server Faces吧,说不定适合你。
2、Web Services
Web Services我去年研究过,还替人招刀写了某Web Services书的其中一章,如果不是为了整合异构系统,我建议你不要采用Web Services。
我的建议是仍然用Java开发桌面客户端,AWT和Swing确实太慢了,但是你可以采用SWT,相当不错,完全采用JNI调用Windows底层图形库,速度快,内存消耗少,界面完全是Windows本地桌面风格。Eclipse自己就是用SWT做出来的,已经相当好了。然后不要用Sun JRE来跑桌面应用,用IBM JRE,速度可以进一步提高。
采用Web Services会带来好多问题:
1、无状态
你每次调用服务端组件都要把状态信息用参数的方式发送给App Server,为此,你还必须在App Server端仔细的设计如何把业务组件良好的封装为Web Services。但不管怎么说,每次调用都要传状态信息,实在太蹩脚了。
Apache SOAP 比较独特,它把状态信息封装在HTTP Cookie里面发送,虽然是个好办法,毕竟不通用。如果你服务器,或者客户端任何一方不采用Apache SOAP,就有得麻烦了,还要自己写代码解析HTTP协议和SOAP协议。
2、不安全
至今没有良好的安全保障机制
3、速度慢
SOAP调用的速度并不是非常慢,经SOAP封装的EJB方法调用,我的经验是由几十ms级降到几百ms级,还可以接受。但是SOAP调用的速度受客户端和服务器端的XML解析器性能的影响非常大,如果你用的XML解析器不灵的话,会非常缓慢。
4、异构系统的可维护性
使用Web Services,客户端实现技术和服务端是不同的,而且还必须把服务端的组件封装为Web Services供客户端调用,这种整合异构技术的方式会带来很多不必要的复杂性,同时提高维护的成本。
总体来说Web Services还非常不成熟,在某些Internet上面使用还有其优势,因为Web Services封装了不同的组件实现方式,使不同技术实现的组件都能用统一的方法来调用和互调用,比如说EJB组件可以调用.net组件,反过来也一样。不过做企业软件,采用单一技术方案会更有把握,尽量不要给系统引入复杂因素。