文档章节

关于集合的性能问题

猪刚烈
 猪刚烈
发布于 2014/10/12 11:41
字数 826
阅读 5
收藏 0
点赞 0
评论 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 ⋅ 2

再谈Scala集合

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

bluishglc ⋅ 2017/12/14 ⋅ 0

关于编程习惯的总结

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

wow863597 ⋅ 2016/07/05 ⋅ 0

C# 集合-并发处理-锁OR线程

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

天才小龙 ⋅ 01/05 ⋅ 0

5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq

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

雲霏霏 ⋅ 2014/09/28 ⋅ 0

Hibernate ORM 4.1.1 发布

Hibernate ORM 4.1.1 刚刚发布,该版本包含一些改进和 bug 修复,特别值得关注的有: 内部 QueryPlanCache 类的大幅性能提升,该类是对 HQL 和 JPQL 以及 SQL 编译的缓存,解决了并发的瓶颈问...

红薯 ⋅ 2012/03/09 ⋅ 1

自学java看什么书?

本文列出的10本书在Java程序员界都是被认为很棒的书。当一个程序员开始初学Java时,他的第一个问题应该是如何选择一本书来作为指导学习Java。这个问题也就表明,相对于其他的教程和博客,Jav...

Miss_Hello_World ⋅ 2015/06/08 ⋅ 0

关于Collection接口下相关类接口的问题及分析

关于Collection接口下相关类接口的问题及分析 List和Set的异同 List和Set本身都是接口,他们都继承了Collection接口,分别表示2种数据机构。一种List可以有重复的数据,可以有多个NULL值;而...

walb呀 ⋅ 2017/12/06 ⋅ 0

redis 的 zrange 效率

zrange 是 redis sorted set 中的一个指令,最近线上有个查询从 mysql 切到了 redis,在使用 mysql 的 offset、limit 查询时,当 offset 过大时会有性能问题,不禁疑惑,用 redis 的 zrange...

throwsterY ⋅ 2017/12/11 ⋅ 0

MapDB:专为Java设计的高性能的数据库

MapDB是一个快速、易用的嵌入式Java数据库引擎,它提供了基于磁盘或者堆外(off-heap允许Java直接操作内存空间, 类似于C的malloc和free)存储的并发的Maps、Sets、Queues。MapDB的前身是JDB...

夕水溪下 ⋅ 2014/07/22 ⋅ 20

没有更多内容

加载失败,请刷新页面

加载更多

下一页

R计算IV

参考文章 #读取文件 rawdata = read.csv("/path/to/csv/file",header=T) colnames(rawdata)[18] <- "y" //重命名因变量y #数据分区 训练集测试集 trainIdx <- sample(nrow(rawdata), round(......

火力全開 ⋅ 13分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

阿里云云栖社区 ⋅ 14分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

猫耳m ⋅ 24分钟前 ⋅ 0

关于ireport自定义变量类型为list的时候

自己摸石头过河,我真的应该去趟市中心图书馆,借本真正靠谱的教材 网上的东西,只有0.01%是有用的,还有0.99%是垃圾,剩下的99%是垃圾的复制品。。 哎!~ 问题是这样的,报表带sql,从db中获...

炑炑milina ⋅ 25分钟前 ⋅ 0

Spring mvc ContextLoaderListener 原理解析

对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 ContextLoaderListener,如下。 <!-- 加载spring上下文信息,最主要的功能是解析applicationContex...

轨迹_ ⋅ 26分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云官方博客 ⋅ 27分钟前 ⋅ 0

Redis安装异常解决办法

官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxvf redis-2.8.17.tar.gz 3. 进入解压缩后的文件夹:c...

slagga ⋅ 32分钟前 ⋅ 0

006. 深入JVM学习—年轻代

1. 年轻代图片 年轻代(Young)属于JVM堆内存空间的一个组成部分 所有使用关键字new新实例化的对象一定会在伊甸园区进行保存,而对于存活区保存的一定是已经在伊甸园区存在一段时间并且经过了...

影狼 ⋅ 33分钟前 ⋅ 0

如何成为一个合格的程序员

偶尔的,我会被人问道:如何成为一名优秀的程序员,更或者,如何成为一名程序员。每次人们问起,我都力图给出不同的答案。因此,我的答案是各种各样的。下面就是我认为的成为一名优秀的程序员...

柳猫 ⋅ 33分钟前 ⋅ 0

cups error_log日志暴增

日志内容 File \"/usr/lib/cups/notifier/dbus\" has insecure permissions 解决(未验证适用范围) sudo service cups stopsudo rm /etc/cups/subscriptions.conf*sudo rm -r /var/cac......

一介码夫_Hum ⋅ 37分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部