日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
理解Hibernate集合性能技術(shù)

本段中,我們將著重講述Hibernate集合性能(Understanding Collection performance)集合在運(yùn)行時(shí)的事宜。包括Hibernate集合性能(Understanding Collection performancee)技術(shù)的分類、Lists, maps 和sets用于更新效率最高、Bag和list是反向集合類中效率最高的。
 
1.Hibernate集合性能分類(Taxonomy),Hibernate定義了三種基本類型的集合:

◆值數(shù)據(jù)集合

◆一對(duì)多關(guān)聯(lián)

◆多對(duì)多關(guān)聯(lián)

這個(gè)分類是區(qū)分了不同的表和外鍵關(guān)系類型,但是它沒(méi)有告訴我們關(guān)系模型的所有內(nèi)容。 要完全理解他們的關(guān)系結(jié)構(gòu)和性能特點(diǎn),我們必須同時(shí)考慮“用于Hibernate更新或刪除集合行數(shù)據(jù)的主鍵的結(jié)構(gòu)”。 因此得到了如下的分類:

◆有序集合類

◆集合(sets)

◆包(bags)

所有的有序集合類(maps, lists, arrays)都擁有一個(gè)由 和 組成的主鍵。 這種情況下集合類的更新是非常高效的——主鍵已經(jīng)被有效的索引,因此當(dāng)Hibernate試圖更新或刪除一行時(shí),可以迅速找到該行數(shù)據(jù)。

集合(sets)的主鍵由 和其他元素字段構(gòu)成。 對(duì)于有些元素類型來(lái)說(shuō),這很低效,特別是組合元素或者大文本、大二進(jìn)制字段; 數(shù)據(jù)庫(kù)可能無(wú)法有效的對(duì)復(fù)雜的主鍵進(jìn)行索引。 另一方面,對(duì)于一對(duì)多、多對(duì)多關(guān)聯(lián),特別是合成的標(biāo)識(shí)符來(lái)說(shuō),集合也可以達(dá)到同樣的高效性能。( 附注:如果你希望SchemaExport為你的 創(chuàng)建主鍵, 你必須把所有的字段都聲明為not-null="true"。)

映射定義了代理鍵,因此它總是可以很高效的被更新。事實(shí)上, 擁有著最好的性能表現(xiàn)。

Bag是最差的。因?yàn)閎ag允許重復(fù)的元素值,也沒(méi)有索引字段,因此不可能定義主鍵。 Hibernate無(wú)法判斷出重復(fù)的行。當(dāng)這種集合被更改時(shí),Hibernate將會(huì)先完整地移除 (通過(guò)一個(gè)(in a single DELETE))整個(gè)集合,然后再重新創(chuàng)建整個(gè)集合。 因此Bag是非常低效的。

注意:對(duì)于一對(duì)多關(guān)聯(lián)來(lái)說(shuō),“主鍵”很可能并不是數(shù)據(jù)庫(kù)表的物理主鍵。 但就算在此情況下,上面的分類仍然是有用的。(它仍然反映了Hibernate在集合的各數(shù)據(jù)行中是如何進(jìn)行“定位”的。)

2.  Lists, maps 和sets用于更新效率最高

根據(jù)我們上面的討論,顯然有序集合類型和大多數(shù)set都可以在增加、刪除、修改元素中擁有最好的性能。

可論證的是對(duì)于多對(duì)多關(guān)聯(lián)、值數(shù)據(jù)集合而言,有序集合類比集合(set)有一個(gè)好處。因?yàn)镾et的內(nèi)在結(jié)構(gòu), 如果“改變”了一個(gè)元素,Hibernate并不會(huì)更新(UPDATE)這一行。 對(duì)于Set來(lái)說(shuō),只有在插入(INSERT)和刪除(DELETE) 操作時(shí)“改變”才有效。再次強(qiáng)調(diào):這段討論對(duì)“一對(duì)多關(guān)聯(lián)”并不適用。

注意到數(shù)組無(wú)法延遲載入,我們可以得出結(jié)論,list, map和idbags是最高效的(非反向)集合類型,set則緊隨其后。 在Hibernate中,set應(yīng)該時(shí)最通用的集合類型,這時(shí)因?yàn)椤皊et”的語(yǔ)義在關(guān)系模型中是最自然的。

但是,在設(shè)計(jì)良好的Hibernate領(lǐng)域模型中,我們通??梢钥吹礁嗟募鲜聦?shí)上是帶有inverse="true" 的一對(duì)多的關(guān)聯(lián)。對(duì)于這些關(guān)聯(lián),更新操作將會(huì)在多對(duì)一的這一端進(jìn)行處理。因此對(duì)于此類情況,無(wú)需考慮其集合的更新性能。

3.  Bag和list是反向集合類中效率最高的

在把bag扔進(jìn)水溝之前,你必須了解,在一種情況下,bag的性能(包括list)要比set高得多: 對(duì)于指明了inverse="true"的集合類(比如說(shuō),標(biāo)準(zhǔn)的雙向的一對(duì)多關(guān)聯(lián)), 我們可以在未初始化(fetch)包元素的情況下直接向bag或list添加新元素! 這是因?yàn)镃ollection.add())或者Collection.addAll() 方法 對(duì)bag或者List總是返回true(這點(diǎn)與與Set不同)。因此對(duì)于下面的相同代碼來(lái)說(shuō),速度會(huì)快得多。

 
 
 
  1. Parent p = (Parent) sess.load(Parent.class, id);  
  2.     Child c = new Child();  
  3.     c.setParent(p);  
  4.     p.getChildren().add(c);  //no need to fetch the collection!  
  5.     sess.flush(); 

4.  一次性刪除(One shot delete)

偶爾的,逐個(gè)刪除集合類中的元素是相當(dāng)?shù)托У?。Hibernate并沒(méi)那么笨, 如果你想要把整個(gè)集合都刪除(比如說(shuō)調(diào)用list.clear()),Hibernate只需要一個(gè)DELETE就搞定了。

假設(shè)我們?cè)谝粋€(gè)長(zhǎng)度為20的集合類中新增加了一個(gè)元素,然后再刪除兩個(gè)。 Hibernate會(huì)安排一條INSERT語(yǔ)句和兩條DELETE語(yǔ)句(除非集合類是一個(gè)bag)。 這當(dāng)然是顯而易見的。

但是,假設(shè)我們刪除了18個(gè)數(shù)據(jù),只剩下2個(gè),然后新增3個(gè)。則有兩種處理方式:

逐一的刪除這18個(gè)數(shù)據(jù),再新增三個(gè);

刪除整個(gè)集合類(只用一句DELETE語(yǔ)句),然后增加5個(gè)數(shù)據(jù)。

Hibernate還沒(méi)那么聰明,知道第二種選擇可能會(huì)比較快。 (也許讓Hibernate不這么聰明也是好事,否則可能會(huì)引發(fā)意外的“數(shù)據(jù)庫(kù)觸發(fā)器”之類的問(wèn)題。)

幸運(yùn)的是,你可以強(qiáng)制使用第二種策略。你需要取消原來(lái)的整個(gè)集合類(解除其引用), 然后再返回一個(gè)新的實(shí)例化的集合類,只包含需要的元素。有些時(shí)候這是非常有用的。

顯然,一次性刪除并不適用于被映射為inverse="true"的集合。


網(wǎng)頁(yè)題目:理解Hibernate集合性能技術(shù)
標(biāo)題URL:http://www.dlmjj.cn/article/dheejdp.html