只有企业级项目才特别需要使用ORM

刚看了一篇文章,本来想跟个贴追捧一下ORM,最后还是决定单独写一个Post,以充分发挥“对台戏”的效果。

先说明一点,我其实不喜欢ORM这个概念,我觉得这个概念并不十分优雅,尽管非常普遍。

什么是大型软件
我不知道原文中的大型软件是什么概念。不过我心目中的概念是结构、功能和逻辑都足够复杂,并发量很大,甚至需要多台服务器进行负载平衡,且一般有一定的应用集成需要的、需要大量人员参与构建的软件。这样的软件其价值非常可观。通常大家都与“企业级应用软件”的概念相互套用。所以,我下文中用“企业级应用软件”来替换原文中的“大型软件”。

现实中的解决方案
在Java的世界里,企业级应用软件自然就使用J2EE方案。比较通用的J2EE解决方案是采用EJB,并采用JDO之类的技术做持久化。由于EJB固有的缺陷,现在用EJB的人越来越少了。原因大家看看Rod Johnson的《J2EE Development without EJB 》应该自然就明白了。但是没有人会推荐在J2EE中直接使用Statement来直接进行持久化,或者对Statement进行一些简单的封装做一个所谓的“通用的持久层”。当然,Hibernate取得了巨大的成功,所以Hibernate3就自然成了JSR的一部分。如果不是因为企业应用的需要,Hibernate其实是没有市场的。
回到.net里。若干年前,当我听说Microsoft打算在SQL Server 2005中实现ORP(Objective-Relational Persistence)的时候,我兴奋了一阵,但事实上最后Microsoft并没有实现这个诺言,就象Microsoft也没有向业界交付Object-Spaces一样。这可能是对ORM持保守态度者的主要依据来源。大家都是通过最原始的方案或者简单的封装(包括企业库中的DAAB)来实现数据访问。这些Helper类被渗透到应用程序的每一个部分,甚至完全耦合。
就象J2EE当年的景象一样,大家都在等待.Net中的Hibernate,在等待中纷纷动手做自己的ORM。在这个过程中冒出来一堆优秀的、商业化的框架,例如ECO、XPO、DataObjects等等。这些框架设计精妙,性能优异。当然也出现了很多优秀的开源框架,例如Neo。它们都各有千秋,有一些功能强大,但结构复杂。有一些功能较弱,但结构简单且易于使用。
Microsoft已经让我在ORP上面失望过一次。我不知道会不会在DLinq上再让我失望一次。我不象某些人那样乐观。

持久层的意义
持久层其实只是一个应用程序中很小的一部分,在应用程序中的地位远不象某些人所描述的那样关键。如果你的设计中系统的分层非常好的话,只有业务逻辑才需要ORM,因为表现层应该是完全不关心持久层的。相反,如果你的系统不分层,ORM的确一点意义也没有。所以,其实小的系统根本不需要ORM。这些系统往往两三个人就可以完成,他们可以直接在页面上使用Native的SQL语句访问数据。呵呵,在Microsoft平台,大量的开发人员都是这么过来的。
但是企业级应用,不分层是无法完成的。每个细小的功能都需要分给三个或者更多的人来完成。如果不分层,则完全无法控制。如果分层的话,在业务逻辑层甚至表现层再直接访问数据库就成了不可思议的事情。这时候,ORM就成了你不多的选择之一。
随着系统越来越庞大,系统对于可维护性、可集成性、可扩展性、可测试性的需要也越来越强,对分层的需要也就越来越迫切。其中任何一个特性的需要,离开ORM都无法很好地实现。

ORM的哪些方面被人指责
性能。大多数人想当然地认为ORM都是性能拙劣,仅仅因为他们用过了NHibernate。我没有用过NHibernate,我无法评价NHiberbate的性能。但是我知道,ORM对性能的影响是极其有限的,如果造成性能问题,往往都是因为使用不当。即使你直接使用ADO.NET也一样会冒出性能问题来。相反,由于Cache的原因,ORM事实上通过空间的牺牲换取了大量数据库访问性能的提升。当然,这要求框架本身实现了这一功能,并且正确地使用。相反,没有ORM的Helper是很难实现Cache的。
使用难度大。我不知道大家如何看待Hibernate的使用。最初的、干净的、不带任何第三方工具的Hibernate完全依靠手工编撰映射文件和POJO代码。即使如此还是有大量的人来使用。而现在的ORM框架多数都提供了这样的工具,帮助你很好地利用框架提供的功能。其实除了对面向对象方面知识和思想的要求,使用ORM后的业务对象来使用。因为通过ORM来编写业务逻辑几乎比任何一种Helper的方式都简单。相反十年前撰写和调试存贮过程的回忆每每让我如恶梦一般。
不稳定。其实持久层是一个很局部的东西,整体上并不复杂。只要有足够的测试就可以保证框架本身的稳定性。如果框架本身稳定,不太可能因为持久层的原因导致系统不稳定。

ORM到哪个程度最合适
大量的开发人员实现了自己的简单的持久层。如果太简单,没有什么意义。如果太复杂往往并不实际。首先,必须真的提升了开发效率,必须切实解决了团队开发中的耦合问题。其次,具有足够的可扩展性。最后,必须提供基本的工具。

结论
不要再提“大型系统”不适合使用ORM的说法了,要知道,ECO就是专门针对“大型系统”的。相反,小系统才完全没有必要使用ORM。

posted on 2007-01-04 21:56 双鱼座 阅读(12239) 评论(21)  编辑 收藏 网摘

评论

#1楼 2007-01-04 22:45 Teddy's Knowledge Base      

呵呵,双鱼老大还是那么较汁~~

个人觉得除了系统小到几条sql就能搞定而不需要ORM框架,很多情况下,需要ORM也是指逻辑概念上,而不是一定指使用一个ORM框架。

.net下性能、灵活性、开发效率都极其优秀的非商业ORM组件至今也没见到过;商业组件不好说,没用过几款,但同样持怀疑态度。一个ORM框架能大大提高开发效率,不过多增加额外的性能瓶颈就谢天谢地了。就目前来说,使用任何ORM组件就要做好在局部对性能有较高要求的地方绕开ORM组件的准备。

也许dlinq的正式发布才是一点真正的希望,我还是对他寄予厚望的,毕竟,只有ms才有在语言和编译器级别兼顾这些性能的能力。
  回复  引用  查看    

#2楼 2007-01-04 23:12 JesseZhao      

都在期待dlinq,那天看了anders的录像,很让人激动啊   回复  引用  查看    

#3楼 2007-01-04 23:52 Dflying Chen      

学习一下……不懂的还很多   回复  引用  查看    

#4楼 2007-01-05 08:18 henry      

不太认同按项目规模来划分是否采用ORM模式,只要这种模式使用成本比原有模式的成本低就适合使用.
对于性能方面比较认同老兄的说法!
  回复  引用  查看    

#5楼[楼主] 2007-01-05 08:51 双鱼座      

@Teddy's Knowledge Base
也许我和你在对性能、灵活性、开发效率的认识上有所不同。见仁见智吧。
@Dflying Chen
过谦了吧?
@henry
你归纳的原则好极了!“只要这种模式使用成本比原有模式的成本低就适合使用”!
  回复  引用  查看    

#6楼 2007-01-05 08:52 iceboundrock      

我一直对企业级非常迷惑
Google的搜索算是企业级么?
我们做了一个项目,部署在客户的几台PC服务器上,前端放了个第四层交换机算是企业级么?
这两个项目,规模好像差太远了。
  回复  引用  查看    

#7楼 2007-01-05 09:37 simonw      

不少orm提供了面向快速开发的特性, 也能为短期的小项目更加降低成本. 而小项目往往没企业级的那么多严格的要求, 如性能,稳定等等. 相反orm能带来更多稳定及一致性, 因此我认为非企业级项目尤其是小项目更加适用.   回复  引用  查看    

#8楼 2007-01-05 11:50 fds2003      

今天又学到东西了!双渔老大每次发言总是能引起一番讨论!!   回复  引用  查看    

#9楼 2007-01-05 12:20 goldany      

orm真的有用么,是否又是过度设计.我感觉还不如普通的方式简单,最起码比较统一,呵呵,现在有不少的orm各有个的方式不统一很乱.现在暂时不想orm.   回复  引用  查看    

#10楼 2007-01-05 12:55 kiler      

@simonw
大项目都自己去写代码?
绝对会累死的。
自己做的东西性能就好?或者更稳定?
干脆用汇编写程序算了,性能更好。
  回复  引用  查看    

#11楼 2007-01-05 13:34 kiler      

很赞同双鱼老大的看法,企业级开发最注重的是软件的稳定性和可维护性,使用orm很好的可以保证这两点。

有人可能会说orm不稳定,那自己写的代码就稳定了?人家写的orm不管是商业的还是开源的,都是经过了严格的测试后在发布的,难道还不我们自己写的东西稳定?

还有的人会说orm性能不好,确实,orm的性能是要差点,但是这个差距是可以接受的,举个例子,你用了orm,打开一个页面需要1秒。不用orm,打开页面需要0.8秒,在客户看来这两个程序区别不大,性能的损失是可以接受的。我觉得对于企业级开发不要过多的关注性能,不影响客户使用就行了。


  回复  引用  查看    

#12楼 2007-01-05 14:51 A.Z      

这个标题完全正确,我支持这样的看法,即使是企业级的应用也要衡量项目的实际业务表的数量和项目的开销,并且在技术人员稳定的状态下ORM应用风险不会太大,实际中也可以减少编码,对.net平台我不看好,Eclipse集成了工具,模版的便利在m$的IDE上还是一种拱手于人的架势,大规模的依赖配置最终会让工程的风险加大。   回复  引用  查看    

#13楼 2007-01-05 16:16 kiler      

@A.Z

你没用过mygeneration吧,用mygeneration写一个nhibernate的模版比Eclipse上面的nhibernate插件好用多了。

顺便说一句java的东西更依赖配置,tomcat spring struts那个不是成堆的配置啊。
  回复  引用  查看    

#14楼 2007-01-05 16:56 Anders Cui      

感觉每一种ORM都不能 完全满足 开发的需要
有些局部需要绕过它
这种"绕过",也是一种成本吧
再加上性能方面的把握和开发辅助工具等的考虑

还是最赞同@henry兄的原则:
“只要这种模式使用成本比原有模式的成本低就适合使用”

  回复  引用  查看    

#15楼 2007-01-05 17:28 那一剑的风情      

我同意双鱼的这句话,“其实持久层是一个很局部的东西,整体上并不复杂。”
确实是这样,没有必要搞的太复杂。
不过是一个权衡罢
  回复  引用  查看    

#16楼 2007-01-05 22:50 阿不      

老大分析得很有道理,园子里对ORM好像是一阵一阵热,已经有好次了。这样的讨论可以让我们对ORM有更多,更好,更深入的了解。
至于在哪些场合下适用ORM,我想还是像你们这些老大给我们传授更多的经验,毕竟性能影响,开发效率等各方面的影响只有在真正实施后才得以体会.不是简单的看ORM好像做更多的事情就认为它会性能的。单从一两倍的性能影响完全是可以被平常开发的一些细节所抵消的。比如你是否经常装箱/拆箱,是否经常手动调用GC,等等这些细节远远不止使用ORM的那点开销的。
关键还是看团队的实现情况,如果一个团队总是习惯于像DataTable使用数据集,到处直接都是使用字段名来访问字段。而使用的三层都是简单的参数传递。无所谓松耦合,也无所谓面向对象,无所谓三层构架,也无法发展更优秀的架构。
当然这也不能说只有ORM才能保证优秀的架构实现,当了解过CommunityServer的人,都知道它没有使用任何的ORM框架,都是直接的SQL+存储过程的实现,它的架构不是照样非常优秀,它的持久层照样易于替换。而且非常易于扩展和维护。
所以啊,使用不使用ORM,构架的组成是否优秀,关键还是在于团队的能力情况,如果数据库设计都无法达到范式的基本要求,无法规范约束关系,那我想所谓的ORM架构就无法很好的实施。
个人意见,也是我这两来年成长过程的一些思考。接下来一段时间也是希望能在ORM上也有一些更加深入的理解,希望得到大家指点。
  回复  引用  查看    

#17楼 2007-01-06 13:06 TT      

有优秀的ORM组件, 有优秀的使用ORM的人或工具,有适合使用ORM的项目,那么使用ORM是非常必要的.如果不是就会出现一些大家计论的问题,但不能一些问题而否认ORM   回复  引用  查看    

#18楼 2007-01-07 02:14 simonw      

kiler 可能没有理解我的意思, 我的意思是orm不仅大项目适合, 小项目也同样适合.   回复  引用  查看    

#19楼 2007-01-07 13:00 kiler      

@simonw
晕死,没看清楚。
  回复  引用  查看    

#20楼 2007-01-13 09:32 乌龙      

一点讨论

1.“企业级应用,不分层是无法完成的。每个细小的功能都需要分给三个或者更多的人来完成。如果不分层,则完全无法控制。”--》是指UI、业务逻辑、DB层分别由不同的人来写吗?个人觉得这样并不是一个好的方案。一是导致一个功能,三个人都得了解一遍业务逻辑(虽然偏重不同),而且增加了沟通协调的成本;二是不利于新成员的成长,尤其是UI层程序员,这样对他个人发展很不好。当然层还是要分的,不过觉得应该让同一个人来写就行。

2.性能及复杂查询问题问题
这个主要看具体项目的性能要求吧。可能自己扩展DbHelper是个不错的解决方法。毕竟像NHibernate这样的ORM是很难支持复杂sql那样的查询。性能问题对成熟的ORM应该大多都是使用不当的问题,但这也隐藏了一个ORM的不足:就是学习成本问题。要避免使用不当,势必要求投入不少学习的时间精力。
当然用了DbHelper,在迁移数据库时可能会有不兼容的问题了,除非你的DbHelper可以兼容多种DB.不管怎样,尽量用标准的SQL肯定是有好处的。
  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 611820 C68nloCanTc=



相关文章:

相关链接:

导航

<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

与我联系

搜索

 

常用链接

留言簿

我参与的团队

我的标签

随笔档案

文章分类

相册

芸芸众生

最新评论

阅读排行榜

评论排行榜