文档章节

关于集合的性能问题

猪刚烈
 猪刚烈
发布于 2014/10/12 11:41
字数 826
阅读 5
收藏 0

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是最为普遍使用的一种集合。使用它不会出现太大的性能问题。

将会先完整

将会先完整

将会先完整将会先完整

 

本文转载自:http://blog.csdn.net/bluishglc/article/details/5553621

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
关于java.util.Vector 或 java.util.Hashtable类过时的讨论

某些高级IDE在检测代码成熟问题时,会报告集合是否过时的问题。目前过时的集合类有两个java.util.Vector 和 java.util.Hashtable 。 Vector的api描述是:从jdk 1.2版本开始,该类被修正为实现...

Barudisshu
2013/09/10
0
2
再谈Scala集合

集合!集合!一个现代语言平台上的程序员每天代码里用的最多的大概就是该语言上的集合类了,Scala的集合丰富而强大,至今无出其右者,所以这次再回过头再梳理一下。 本文原文出处: 本文原文链...

bluishglc
2017/12/14
0
0
关于编程习惯的总结

关于编程习惯的总结在编程过程中良好的编程习惯,不仅仅能使代码可读性强,简洁,更是体现在减少程序Bug,易于找Bug,提高程序性能上面。以下是自己对于这方面的理解。一、关于对象,方法,类...

wow863597
2016/07/05
21
0
C# 集合-并发处理-锁OR线程

每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默。...

天才小龙
2018/01/05
0
0
5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq

5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编程 —— 第三...

雲霏霏
2014/09/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

漏洞防御与修复工作

漏洞管理工作是企业安全建设必不可少的一环,在风险管理工作中,漏洞管理能够防患于未然,企业对漏洞管理有着广泛的基础建设和实践经验。但随着攻防技术的发展,传统漏洞管理的安全技术和管理...

linuxprobe16
39分钟前
1
0
MicroPython技术及应用前景

1 Micropython技术是什么? MicroPython极精简高效的实现了Python3语言。它包含Python标准库的一小部分,能在单片机和受限环境中运行。 1.1 MicroPython发展 由剑桥大学的理论物理学家乔治....

bodasisiter
45分钟前
2
0
跟我学Spring Cloud(Finchley版)-13-通用方式使用Hystrix

本节详细讲解使用Hystrix的通用方式。 简介 Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix主要...

周立_ITMuch
53分钟前
1
0
🛠️Hanjst/汉吉斯特更新加JavaScript运行时优化等

这是 Hanjst/汉吉斯特 发布以来的首个主要升级更新版本。这次的主要升级更新的内容包括移除HTML Comments注释行, 优化在 Hanjst include模板文件时的JavaScript运行时环境。 Hanjst 在设计和...

wadelau
今天
2
0
OSChina 周六乱弹 —— 舔狗是没有好下场的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听什么# #今天听这个# 分享 Nirvana 的歌曲《Smells Like Teen Spi...》 《Smells Like Teen Spi...》- Nirvana 手机党少...

小小编辑
今天
556
14

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部