欢迎来到天天文库
浏览记录
ID:36221343
大小:105.00 KB
页数:16页
时间:2019-05-07
《hibernate优化》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、1.抓取优化抓取是指Hibernate如何在关联关系之间进行导航的时候,Hibernate如何获取关联对象的策略,其主要定义了两个方面:如何抓取和何时抓取。1)如何抓取。Hibernate3主要有两种抓取方式,分别应用于对象关联实例(many-to-one、one-to-one)和对象关联集合(set、map等),总共是四种变种:JOIN抓取:通过在SELECT语句中使用OUTERJOIN来获得对象的关联实例或者关联集合)SELECT抓取:另外发送一条SELECT语句来抓取当前对象的关联实体和集合在我的开发经历中,此处对性能的优化是比较有限的,并不值得
2、过多关注例:A.应用于对象关联实例(默认是false)B.应用于对象关联集合(默认是auto)....2)何时抓取主要分为延迟加载和立即抓取,默认的情况下Hibernate3对对象关联实采用延迟加载,普通属性采用立即抓取,通过延迟加载和采用适当的抓取粒度,与不采用优化相比往往可以将性能提升数倍。立即抓取:当抓取宿主对象时,同时抓取其关联对象和关联集以及属性延迟加
3、载:当抓取宿主对象时,并不抓取其关联对象,而是当对其对象进行调用时才加载。例:A.应用于对象关联实例(默认是延迟加载)B.应用于对象关联集合(默认是延迟加载)....对于延迟加载,需要注意的时,对延迟对象的使用必须在Session关闭之前进行,Hibernate的LazyInitalizationException往往就是由于在Session的生命期外使用了延迟加载的对象。当我们进行We
4、b开发时,可以使用OpenSessionInView模式,当请求开始时打开session,当请求响应结束时才关闭session,不过,在使用OpenSessionInView模式时,需要注意如果响应时间比较长(业务比较复杂或者客户端是低速网络),将Session资源(也就是数据库的连接)占用太久的话可以会导致资源耗尽。3)抓取粒度抓取粒度指的是对象在关联关系之间被导航时一次预先加载的数量,Hibernate程序的性能比较差往往就在于没有对抓取粒度仔细考虑,当加载一个列表并在列表中的每个对象中对其关联进行导航时,往往导致N+1条SQL语句查询。例:A.应
5、用于对象关联实例(默认为1),注意,对对象关联实例的设置是在被关联的对象之上的,譬如classUser{Groupg;}那么抓取粒度应该在Group的配置文件之上,见下...对该值并没有一个约定俗成的值,根据情况而定,如果被关联表数据比较少,则可以设置地小一些,3-20,如果比较大则可以设到30-50,注意的时候,并不是越多越好,当其值超过50之后,对性能并没有多大改善但却无谓地消耗内存假设有如下例子:Listusers=query
6、.list();如果有20个User,并对这20个User及其Group进行遍历,如果不设置batch-size(即batch-size="1"),则在最糟糕的情况下,需要1+20条SQL语句,如果设置batch-size="10",则最好的情况下只需要1+2条SQL语句。B.应用于对象关联集合(默认为1)....2.二级缓存Hibernate对数据的缓存包括两个级:一级缓存,在Session的级别上进行,主要是对象缓存,以其id为键保存对象,在Session的生命期间存在;二级缓
7、存,在SessionFactory的级别上进行,有对象缓存和查询缓存,查询缓存以查询条件为键保存查询结果,在SessionFactory的生命期间存在。默认地,Hibernate只启用一级缓存,通过正确地使用二级缓存,往往可以获得意想不到的性能。1)对象缓存:当抓取一个对象之后,Hiberate将其以id为键缓存起来,当下次碰到抓取id相同的对象时,可以使用如下配置。方法1:在缓存对象上配置useage表示使用什么
8、类型的缓存,譬如只读缓存、读写缓存等等(具体参见Hibernate参考指南),值得注意的时,有
此文档下载收益归作者所有