成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

理解Hibernate集合性能技術

開發 后端
Hibernate集合性能(Understanding Collection performancee)技術的分類、Lists, maps 和sets用于更新效率最高、Bag和list是反向集合類中效率最高的。

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

◆值數據集合

◆一對多關聯

◆多對多關聯

這個分類是區分了不同的表和外鍵關系類型,但是它沒有告訴我們關系模型的所有內容。 要完全理解他們的關系結構和性能特點,我們必須同時考慮“用于Hibernate更新或刪除集合行數據的主鍵的結構”。 因此得到了如下的分類:

◆有序集合類

◆集合(sets)

◆包(bags)

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

集合(sets)的主鍵由和其他元素字段構成。 對于有些元素類型來說,這很低效,特別是組合元素或者大文本、大二進制字段; 數據庫可能無法有效的對復雜的主鍵進行索引。 另一方面,對于一對多、多對多關聯,特別是合成的標識符來說,集合也可以達到同樣的高效性能。( 附注:如果你希望SchemaExport為你的創建主鍵, 你必須把所有的字段都聲明為not-null="true"。)

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

Bag是最差的。因為bag允許重復的元素值,也沒有索引字段,因此不可能定義主鍵。 Hibernate無法判斷出重復的行。當這種集合被更改時,Hibernate將會先完整地移除 (通過一個(in a single DELETE))整個集合,然后再重新創建整個集合。 因此Bag是非常低效的。

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

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

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

可論證的是對于多對多關聯、值數據集合而言,有序集合類比集合(set)有一個好處。因為Set的內在結構, 如果“改變”了一個元素,Hibernate并不會更新(UPDATE)這一行。 對于Set來說,只有在插入(INSERT)和刪除(DELETE) 操作時“改變”才有效。再次強調:這段討論對“一對多關聯”并不適用。

注意到數組無法延遲載入,我們可以得出結論,list, map和idbags是最高效的(非反向)集合類型,set則緊隨其后。 在Hibernate中,set應該時最通用的集合類型,這時因為“set”的語義在關系模型中是最自然的。

但是,在設計良好的Hibernate領域模型中,我們通常可以看到更多的集合事實上是帶有inverse="true" 的一對多的關聯。對于這些關聯,更新操作將會在多對一的這一端進行處理。因此對于此類情況,無需考慮其集合的更新性能。

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

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

  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)

偶爾的,逐個刪除集合類中的元素是相當低效的。Hibernate并沒那么笨, 如果你想要把整個集合都刪除(比如說調用list.clear()),Hibernate只需要一個DELETE就搞定了。

假設我們在一個長度為20的集合類中新增加了一個元素,然后再刪除兩個。 Hibernate會安排一條INSERT語句和兩條DELETE語句(除非集合類是一個bag)。 這當然是顯而易見的。

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

逐一的刪除這18個數據,再新增三個;

刪除整個集合類(只用一句DELETE語句),然后增加5個數據。

Hibernate還沒那么聰明,知道第二種選擇可能會比較快。 (也許讓Hibernate不這么聰明也是好事,否則可能會引發意外的“數據庫觸發器”之類的問題。)

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

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

【編輯推薦】

  1. 簡述Hibernate中加載并存儲對象
  2. Hibernate傳播性持久化攻略
  3. 深入了解Hibernate自動狀態檢測
  4. 簡單學會Hibernate對象持久化
  5. 分析Hibernate自增主鍵
責任編輯:仲衡 來源: javanb
相關推薦

2012-02-03 11:17:33

HibernateJava

2009-09-23 14:23:51

Hibernate主鍵

2009-09-24 09:44:32

Hibernate j

2009-06-16 16:10:59

Hibernate性能

2009-09-25 09:46:02

Hibernate高級

2012-06-02 00:55:44

HibernateflushJava

2009-06-18 10:29:24

Hibernate I

2009-09-25 09:14:35

Hibernate日志

2009-06-16 16:39:49

Hibernate性能

2009-09-22 17:41:07

Hibernate性能

2009-06-06 15:37:22

Hibernate性能

2009-09-22 12:45:00

Hibernate性能

2009-09-22 15:22:08

Hibernate性能

2009-09-22 17:25:41

優化Hibernate

2009-09-25 13:10:15

Hibernate性能

2009-09-23 08:56:18

Hibernate cHibernate i

2009-09-28 09:40:28

Hibernate集合延遲加載

2009-09-23 11:37:31

Hibernate S

2009-03-16 16:00:19

HibernateJ2EE配置

2009-07-06 18:29:55

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人三级在线播放 | 玖玖视频免费 | 一级片在线观看 | 午夜影院中文字幕 | 国产精品久久亚洲 | 欧美 日韩 国产 成人 | 天天插天天操 | 911精品国产| 免费毛片网站 | 成人在线看片 | 亚洲精品一区国语对白 | 伊人久久精品 | av在线成人| 三级av在线| 日本精品久久 | 在线看片网站 | 韩日中文字幕 | 一级毛片免费 | 日韩精品视频一区二区三区 | 男人天堂网址 | 欧美日韩一区二区三区四区 | 日本精品一区二区三区在线观看视频 | 精品国产aⅴ | 香蕉久久a毛片 | 亚洲激情av | 男女啪啪高潮无遮挡免费动态 | 97在线播放| 亚洲国产成人av好男人在线观看 | 亚洲一区网站 | 日韩一二三区视频 | 看片地址 | 亚洲第一免费播放区 | 精品在线看 | 成人精品在线观看 | 久久国产成人午夜av影院武则天 | 久久久久久蜜桃一区二区 | 色综合一区二区三区 | 国产精品久久久久久网站 | 一区二区三区av | 99资源| 亚洲永久入口 |