文档章节

关于集合的性能问题

猪刚烈
 猪刚烈
发布于 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线程

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

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

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

雲霏霏
2014/09/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka技术资料总结(不断更新中)

1、Kafka实践:到底该不该把不同类型的消息放在同一个主题中 2、Kafka剖析系列: Kafka剖析(一):Kafka背景及架构介绍 Kafka设计解析(二):Kafka High Availability (上)...

九州暮云
56分钟前
1
0
面向对象设计原则(OOP)

单一职责原则(Single responsibility principle)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。 核心原则:低耦合,高内聚。 一个类,应该只有一个引起它变化的原因,也就是...

gackey
今天
4
0
C++ 锁

C++提供了两种常用的锁,std::lock_guard<Lockable &T>和std::unique_lock<Lockable &T>。通常使用场景下,这两个锁用法一致。即,在构造锁对象时上锁,在析构锁对象时解锁。使用户从上锁/解...

yepanl
今天
4
0
Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
4
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部