对Hibernate使用之愚见


  国人跟风之潮,自古有之,至今亦然。

   确实,经过配置优化的Hibernate效率与无任何优化的Hibernate效率诚然不可同日而语。但由于项目开发的复杂性,开发周期中一些突发因素的制约,及项目构建者自身能力的约束,在大型项目中,尤其是在表结构复杂的大型项目中,以某之愚见,国内能将Hibernate真正使用妥当者,尚未多有。

目前随处可见的Hibernate优化方式无外以下几条

   1、修改hibernate.properties,增加以下两句:

          hibernate.jdbc.fetch_size=50 设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,目前MySQL似乎还不支持
          hibernate.jdbc.batch_size=100 对数据库进行批量删除,批量更新和批量插入的时候的批次大小,令多条语句使用batch操作

   2、one-to-many的关系里将lazy设成true,开启延迟加载

   3、HQL优化,对于语句本身进行优化

   4、映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化)

   5、对大数据量查询时,慎用list()或者iterator()返回查询结果

   6、Session管理优化,可考虑使用spring的HibernateTemplate

   7、一级缓存的管理优化

   8、针对二级缓存,使用相关策略

   9、事务控制优化
 
  另外Hibernate本身借助cglib对字节码有一定程度的优化,但是目前受到Java本身效率限制,感觉上帮助并非很大。

  当然了,我仅是大体上说说,本身还有很多很多细节方面的问题存在,及其它很多设置可供调整。但是,由于本人之不学,即使这样,设定出的Hibernate之效率依旧不高,PS:我开篇便已说过,这是由于本人能力低下造成的,与Hibernate无甚相关。

  但在同样表结构复杂项目中,使用相对简单的ibatis,不需什么配置,却明显在效率上优于Hibernate(再重申,在下从没说过Hibernate效率有问题,只是某才疏学浅配置不当而已),

  我粗略的将两者作以下对比:


1.  iBATIS非常简单易学,Hibernate相对较复杂,门槛较高(借助IDE还比较方便)。

2.  二者都是比较优秀的开源产品(谁否认?谁敢否认?)

3.  当系统属于二次开发,无法对数据库结构做到控制和修改,那iBATIS的灵活性将比Hibernate更适合(我就是经常做遗留项目……)

4.  系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。在这种情况下iBATIS会有更好的可控性和表现。

5.  iBATIS需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些Hql。同样的需求,iBATIS的工作量比

Hibernate要大很多。类似的,如果涉及到数据库字段的修改,Hibernate修改的地方很少,而iBATIS要把那些sql mapping的地方一一修改。(真正配置好的Hibernate当然很方便,问题是什么人负责配置……)

6.  iBATIS以数据库字段一一对应映射得到的PO和Hibernte这种对象化映射得到的PO是截然不同的,本质区别在于这种PO是扁平化的,不像Hibernate映射的PO是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路。

7.  Hibernate现在已经是主流O/R Mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于iBATIS(从目前大多数公司的跟风态度便可以看出)

8.  最关键的一句话是iBATIS的作者说的,我认为很诚恳:
If you are starting a new project and you're in full control of your object model and database design, Hibernate is a good choice of O/R tool.
If you are accessing any 3rd party databases (e.g. vendor supplied), or you're working with a legacy database, or even just a really poorly designed database, then an O/R mapper might not be capable of handling the situation. That's were an SQL Mapper comes in handy

 事实上,我并不反对Hibernate,而且是在争取成为其拥护者(最近在开始扣Hibernate代码,其实从05年就开始,但是没坚持超过3天……),

但是,以某之不才及短见,却不赞同无论任何项目都使用Hibernate,尤其是无理由的想当然跟风使用。甚至某些人把背下Hibernate中一些API都当成很自豪的事情,更让我觉得不可理喻。
 
 框架体系这些东西,说到底,是为更有效的完成编程目的而存在的。无论内部斗得多么厉害,对用户来说也是毫不相关的事情(除非用户在某些事物影响下自己提出来要用什么框架……), 愚虽不才,还是希望能因时因人因事而定,不要一概而论。

有感而发,不知所云,兴起而言,兴尽乃至。
 

你可能感兴趣的:(Hibernate)