Hibernate在解决性能问题方面做得非常好有了它的缓存机制使用第三方缓存和数据库连接池就较好的解决的性能问题但这些还不够hibernate给了开发者足够的自由让开发者自己去控制性能问题
学习了一段时间的ibatis我觉得hibernate有着ibatis无法替代的优势
开发者都知道hibernate让我们以oo的方式操作数据库这让我们看到了hibernate的强大之处体验到操作数据的方便但Gavin King说hibernate最耀眼之处是hibernate的缓存机制而不是以oo的方式操作数据库Hibernate的缓存机制不外乎是一级缓存session二级缓存sessionFactory和第三方缓存如ehcache也就是hibernate的最强大的地方是它的缓存理解了这个才能真正的理解hibernate缓存实在太难了我至今未能真正理解
可维护性ibatis宣扬写sql语句它将sql语句放进一个单独的xml文件这种方式赢得了很多开发者的喜爱一句话方便维护但hibernate同样具有这种功能而且比ibatis更加强大Hibernate的命名查询/命名参数查询就是将hql语句放在一个单独的xml文件之中它仍然让人们以面向对象的方式去操纵数据这得到大量遵循oo方式开发者的喜爱而不用在以oo的方式写着代码的同时然后再转变思维用面向关系的方式去写那些sql语句但hibernate不仅做了这些它的native sql查询方式完全满足sql语句的偏爱者它像ibatis一样将sql语句放在配置文件之中
性能我坚信hibernate性能问题不是问题想想那么多大中小项目都在使用hibernate你还怀疑hibernate的性能吗?spring整合hibernate之后在真正性能瓶颈的地方完全可以使用spring集成的jdbc或直接写存储过程得了但首先得确认这实在是性能瓶颈的地方我想不应想当然的认为性能的问题所谓的性能问题阻挠了很多人
我认为性能的好坏无外是发送sql语句的多少而已性能好发送的sql语句少性能差就是发送大量的sql语句Hibernate在解决性能问题方面做得非常好
有了它的缓存机制使用第三方缓存和数据库连接池就较好的解决的性能问题
但这些还不够hibernate给了开发者足够的自由让开发者自己去控制性能问题
我认为开发者可以在以下几个方面自行调优
a在查询字符串中应该总是使用jdbc的占位符?或使用使用命名参数不要自查询中使用字符串值来代替非常量值
bFlush会影响性能频繁刷新影响性能尽量减少不必要的刷新
cCascade策略在几对几的关系正确设置cascade策略想清楚在操作对象A的同时是否需要级联操作对象B比如在one to many的父子关系中删除了父亲one需级联删除子many这时的one这端可设置cascade = delete这样在删除one时会自动删除子但对子的操作不会影响父Cascade还有其他的属性值只要设置正确可提升性能
dlazy策略正确设置延迟加载策略同样会提升性能在one to many或many to many中通常总应该延迟加载many的一方的到内存设置了lazy = true首先发送sql语句加载自己到内存到需要时才加载级联对象lazy=false则会同时加载自己和级联对象到内存
e另外还有集合的性能(setlistmaparray)都应正确设置
f正确使用第三方缓存在读操作频繁写操作不多的情况使用第三方缓存可大幅度提升性能如ehcache的缓存策略有readonlyreadwrite和notstrictreadwrite
f 随着hibernate新版本的发布和技术的发展我相信hibernate的性能会越来越好所有性能不是不使用hibernate的原因
hibernate不仅仅作为持久层的orm框架存在它除了dao层的持久化操作外还有很多
在注解annotation已经走向主流的今天hibernate 迅速响应让xml部署描述符成为可选的Hibernate annotation 对大字段的处理只是一个@Lob就搞定了
hibernate search对Lucene进行了轻量级的封装全文检索变得非常简单
Hibernate validator被认为是最合理的验证方式将验证策略直接附在贯穿各层的领域模型domain上不再需要哪些web框架的xml方式的验证代码中不再出现大量的非空/null的判断
jbpm Jbpm业务流程引擎的持久层采用hibenrnate来实现要想使用jbpmhibernate是必须的我想业务流程管理无比重要在soa迅速发展的今天如果实施soa项目业务流程管理是必然和必须的因为soa就是业务和it技术的融合是业务流程管理和it基础架构的融合在soa中业务管理是第一位的这需要相应的技术来实现该业务流程管理开源领域的jbpm我想会是首选所以为了将来有可能实施soa项目为了实现soa的业务流程管理应该使用hibernate
大家都知道hibernate将ejb时代的实体bean赶进了历史而ejb的jpa标准也只不过是hibernate的子集而已jsr规范请求的威力是巨大的没有各种jsr规范请求就不会有各种应用程序框架各种应用程序框架只是那些jsr规范请求的实现者jpa作为持久层的规范标准引导持久层orm框架的方向jpa同样以面向对象的方式操作数据库而不是写sql语句规范标准都完全orm不写sql了你还有理由不跟着它吗?
Spring+hibernate+范型+可变参数这是一个非常强大的组合对应普通的crud操作你不再需要重复写那些烦人的相似的dao层和manager层的代码仅仅需要写一次就完成了所有大量的crud操作Ibatis尽管也支持范型但始终没有hibernate支持的好
Jbosshibernate是jboss的项目jboss的所有项目的持久层都采用的hibernate要知道jsr规范组的专家们大多数是来自jboss的在一定程度上说jboo引领着java的发展方向使用hibernate跟着jboss不偏离java的发展方向
Gavin King我最崇拜的偶像他不仅发明了强大的hibernate还搞出了同样强大且优雅的web应用程序框架seam他是ejb专家组成员之一是jpa规范请求的领导者他java领域最有发言权最权威的领袖人物之一现在他领导web bean的jsr的发展web bean规范的制定全球软件巨头如ibmoraclebea和apache没有一个反对纷纷响应Web bean想象起来实在太美好了完全的松耦合和强类型所有的应用组件生活在一个应用组件上下文context中相互合作那时将不再有各种各样的上下文环境不再有struts的ActionContext不再有spring的ApplicationContext不再有hibernate的session不再有持久化上下文不再有事务上下文不再有安全上下文所有组件生活在一个大家庭中大家其乐融融实现天下的大和平
osgi我认为现在最值得学习的一个技术有了osgi实现真正的多模块开发改变传统的开发方式现在已经有了hibernate osgispring dynamic modul(osgi)struts 同样实现了对osgi的支持目前eclipse是基于osgi开发的ibm的websphere vbea的所有产品都重构在osgi上spring的应用服务器同样基于osgi在EclipseCon上osgi成为了主要的话题Osgi受到如此的待遇一点不奇怪因为他具有无比强大的功能改变传统的软件开发方式Osgi采用树设计模式将一个项目分成多个模块(bundle)每个模块单独部署单独运行说白了就是将一个工程分成许多的插件每个插件单独开发重复使用实现完全的即插即用太令人激动了如果公司的软件开发基于osgi将会有大量的重复使用的osgi bundles公司将会积累大量的无形资产软件开发将会越来越快而ibatis现在还没见到对osgi的支持
hibernate的社区非常繁荣ibatis则相对平静
综述hibernate还有很多优秀的特点只是我们不知道Hibernate与ibatis就像大家闺秀对小家碧玉大家闺秀不仅具有小家碧玉的全部而且知名度更高更受尊敬更受人追捧更有发展前途小家碧玉尽管也很有魅力但始终比上大家闺秀
Hibernate所做的不仅仅是dao层的持久化工作而ibatis恰恰如此
选择hibernate选择orm的王者选择更全面的工作体验选择更高效的工作方式选择更多的利润选择Gavin King跟着领袖走选择jboss追随开源的潮流不偏离java的发展方向
一切都不是借口一切都在发展hibernate会越来越好