Hibernate高级应用:性能优化策略
2012-09-17 20:42:48 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劎绮妵鍕箳鐎n亞浠鹃梺闈涙搐鐎氫即鐛崶顒夋晬婵絾瀵ч幑鍥蓟閻斿摜鐟归柛顭戝枛椤牆顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秵妫冮崺鈧い鎺戝瀹撲礁鈹戦悩鎻掝伀缁惧彞绮欓弻娑氫沪閹规劕顥濋梺閫炲苯澧伴柟铏崌閿濈偛鈹戠€n€晠鏌嶆潪鎷屽厡闁汇倕鎳愮槐鎾存媴閸撴彃鍓卞銈嗗灦閻熲晛鐣烽妷褉鍋撻敐搴℃灍闁绘挻娲橀妵鍕箛闂堟稐绨肩紓浣藉煐濮樸劎妲愰幘璇茬闁冲搫鍊婚ˇ鏉库攽椤旂》宸ユい顓炲槻閻g兘骞掗幋鏃€鐎婚梺瑙勬儗閸樺€熲叺婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閳锋垶銇勯幒鍡椾壕缂備礁顦遍弫濠氱嵁閸℃稒鍊烽柛婵嗗椤旀劕鈹戦悜鍥╃У闁告挻鐟︽穱濠囨嚃閳哄啰锛滈梺褰掑亰閸欏骸鈻撳⿰鍫熺厸閻忕偟纭堕崑鎾诲箛娴e憡鍊梺纭呭亹鐞涖儵鍩€椤掑啫鐨洪柡浣圭墪閳规垿鎮欓弶鎴犱桓闂佸湱枪閹芥粎鍒掗弮鍫熷仺缂佸顕抽敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掍胶绠剧€光偓婵犱線鍋楀┑顔硷龚濞咃絿妲愰幒鎳崇喓鎷犻懠鑸垫毐闂傚倷鑳舵灙婵炲鍏樺顐ゆ嫚瀹割喖娈ㄦ繝鐢靛У绾板秹寮查幓鎺濈唵閻犺櫣灏ㄥ銉р偓瑙勬尭濡繂顫忛搹鍦<婵☆垰鎼~宥囩磽娴i鍔嶉柟绋垮暱閻g兘骞嬮敃鈧粻濠氭偣閸パ冪骇鐎规挸绉撮—鍐Χ閸℃ê闉嶇紓浣割儐閸ㄥ墎绮嬪澶嬪€锋い鎺嶇瀵灝鈹戦埥鍡楃仯闁告鍕洸濡わ絽鍟崐鍨叏濡厧浜鹃悗姘炬嫹

1.一级缓存(session里面的实体对象,存放在内存中)
☞get/load/list/iterate可以将对象放入到一级缓存中
List操作不会利用一级缓存
☞get/load/iterate可以利用一级缓存
☞flush方法将改变后的同对象持久化到数据库中
2.二级缓存
即SessionFactory级别的缓存。默认的情况下是打开的。这是一个全局缓存策略。它可以对对象的数据进行全局缓存。
一级缓存 二级缓存 缓存的是实体对象
缓存的key是ID,缓存的value是实体对象
3.查询缓存(慎用)
即对查询的结果集进行缓存处理,以便下次相同条件相同HQL的情况下可以直接从缓存中获取数据。
查询缓存的作用,是对list操作的查询结果集进行缓存!
缓存的是普通结果集
缓存的key是HQL中的语句与参数,缓存的value则:
(1)如果查询的结果为普通结果集,则缓存这些结果集
(2)如果查询的结果为实体对象,则缓存实体对象的ID列表
用查询缓存的时候,二级缓存也要启用,防止发出多条语句
我们使用list操作的时候,如果启用了查询缓存,hibernate将根据当前查询的HQL语句(及其参数值)计算出一个缓存的key值;查询结果集,将作为缓存的value值(但如果查询结果集是一个对象结果集的话,其缓存的value值是对象的ID集合,而不是对象集合本身)。
<o:p> </o:p>
可以在hibernate配置文件中添加:
<property name="hibernate.cache.use_query_cache">true</property><o:p></o:p>
以便打开查询缓存。
<o:p> </o:p>
查询缓存,对对象查询,将缓存其ID列表;对普通查询,将缓存整个数据集合。所以,对于对象查询,需要配合二级缓存来使用。
<o:p> </o:p>
在打开了查询缓存之后,需要注意,调用query.list()操作之前,必须显式调用query.setCachable(true)来标识某个查询使用缓存。
4.批量抓取
(1)抓取策略,有一个对象 ,即如何获取关联的策略。
(2)什么叫批量抓取:有一批对象,想得到这批对对象的关联
(3)在many-to-one/one-to-many中设置:fetch(在hbm.xml语句中配置)
Fetch="select" 查询抓取,通过第二条语句查询关联(这是默认值)
Fetch="join" 连接抓取,在加载的同时通过一条外连接已经把关联的对象加载
上来了,所以设置的lazy配置失效
Fetch="join" 对于批量抓取的时候是无效的
当Fetch="select"可以定义批量抓取策略,在对方的class映射文件中配置batch-size
即可
连接抓取(Join fetching) - Hibernate通过 在SELECT语句使用OUTER JOIN(外连接)来 获得对象的关联实例或者关联集合。 连接抓取策略可以被定义在<many-to-one/>或集合(如<set/>)标签上。这种抓取策略,对load/get操作有效。
· 如在Student的<many-to-one/>标签上设置fetch=”join”,当我们load/get一个Student的时候,其classes属性的值,将通过一个outter join连接查询来获取
· 或在Classes类的<set />标签上设置fetch=”join”,当我们load/get一个Classes类的实例的时候,其集合数据,也是通过一个outter join连接查询来抓取
· 查询抓取(Select fetching) - 另外发送一条 SELECT 语句抓取当前对象的关联实体或集合。除非你显式的指定lazy="false"禁止 延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。 这种抓取策略,设置方法为:fetch=”select”;
更多精彩
赞助商链接