關於集合的效能問題

2021-08-25 04:27:18 字數 2477 閱讀 4158

1.bag 是所有非反向集合型別中效能最差的(但卻是反向集合中效能最好的,還有list。)。因為 bag 允許重複的元素值,也沒有索引字段,因此不可能定義主鍵。

hibernate 無法判斷出重複的行。當這種集合被更改時,hibernate 將會先完整地移除 (通過一

個(in a single delete))整個集合,然後再重新建立整個集合。因此bag 在非反向集合中是非常低效的。

這一點我已做過驗證,確實如文件所說:如果bag集合有任何變動,hibernate會刪除集合中的所有元素(通過乙個delete),然後重新把最新狀態的集合一條條插入資料庫。之所以會出現這種情況是因為bag允許有重複的元素,並且是無序,bag元素對應的表既不會生成主鍵,也不會建立索引列。這樣一來,一旦集合有任何更新,hibernate根本不知道是要更新資料庫中的哪條記錄,因此只能刪除全部資料重建!換句話說:對於bag集合,一旦它從資料庫中載入到記憶體中,hibernate根本沒辦法知道記憶體中的乙個物件對應於資料庫中的哪條記錄!因此,如果有更新,只能是全部刪除重新再建。

在把 bag 扔進水溝之前,你必須了解,在一種情況下,bag 的效能(包括list)要比 set 高得

多:對於指明了 inverse="true" 的集合類(比如說,標準的雙向的一對多關聯),我們可以在未

初始化(fetch)包元素的情況下直接向 bag 或 list 新增新元素! 這是因為 collection.add())

或者 collection.addall() 方法對 bag 或者 list 總是返回 true(這點與與 set 不同)。因此

對於下面的相同**來說,速度會快得多。

parent p = (parent) sess.load(parent.class, id);

child c = new child();

c.setparent(p);

p.getchildren().add(c); //no need to fetch the collection!

sess.flush();

簡單總結一下原則:

如果是標準的父子關係,並且集合設定了inverse=true,那麼可以使用bag。

如果是單向的one-to-many,切勿使用bag!而應該使用set!

以下是hibernate文件對各種集合效能的總結:

list,map 和 idbags 是最高效的非反向(inverse=false)集合型別,set 則緊隨其後。bag最差.

bag 和 list 是反向集合(inverse=true)中效率最高的

在 hibernate 中,set 應該時最通用的集合型別,這是因為「set」的語義在關係模型中是最自然的。

對於inverse=true的one-to-many集合,可以不考慮集合的效能。因為對於集合的更新是在many方處理的。

對於沒有設定inverse=true的one-to-many集合(絕大多數情況是這是乙個單向集合),最好選擇set.bag是一定不要用的。

對於單向one-to-many(inverse必定為false),絕不能用bag,推薦set.

對於雙向one-to-many(一般inverse都會設為true),選哪一種集合並無太大差別。

蹤上,set是最為普遍使用的一種集合。使用它不會出現太大的效能問題。

將會先完整

將會先完整

將會先完整將會先完整

關於集合的效能問題

1.bag 是所有非反向集合型別中效能最差的 但卻是反向集合中效能最好的,還有list。因為 bag 允許重複的元素值,也沒有索引字段,因此不可能定義主鍵。hibernate 無法判斷出重複的行。當這種集合被更改時,hibernate 將會先完整地移除 通過一 個 in a single delet...

關於遞迴的效能問題

一直以為遞迴比較方便,也知道遞迴相對於堆疊實現會有一些效能方面的問題,一直沒引起重視,但今天測試了乙個例項,結果真的很嚇人,看來以後在這方面一定要多多注意了。問題的提出,題目 已知數列 1,1,2,3,5,8,13,21,34,求第50個數值?並用c 寫出演算法?一看就知道是菲波那契數列,用簡單的遞...

關於if巢狀效能的問題

要求 判斷a,b,c.等是否符合特定型別,都符合執行特定函式 自定義函式 check string str 判斷函式是否符合特定型別,符合返回true,否則返回false message string str 伺服器端事件,實現彈出警告 doaction 待執行的特定函式 第一種邏輯 string ...