文档章节

在Hibernate环境下对大型集合的处理

猪刚烈
 猪刚烈
发布于 2014/10/12 11:47
字数 670
阅读 4
收藏 0

在Hibernate环境下,对大型集合的访问管理是一个非常值得重视的问题。一次将大型集合加载到内存是不能容忍的。因此在操作这种集合时要特别小心。下面给出一些建议。

1.使用@org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.EXTRA)注解大型集合,确保在访问集合的size(),isEmpty(),contains()方法时不会导致整个集合载入内存。这个方法的作用有限,如果调用add(),remove()等方法时,这个集合还是会加载出来。

2. 反向bag和list集合是性能最高的。这一点体现在使用collection.add()或collection.addAll()时也不会导致整个集合加载。(注意:必须是反向集合)。但是考虑到bag集合的种种缺点,这一点可利用的价值也不大。

3. 避免一切可能导致整个集合被一次性加载出来的操作。这需要在集合的宿主对象上屏蔽该集合的get方法,禁止外部直接获取该集合的引用。

4. 如果集合被封装到宿主对象内部,那么如果需要向集合add/remove/update元素,应该怎样处理呢?这是一个值得仔细考虑的问题。目前我倾向于这样处理:如果元素是聚合根,那么我们应该独立对它进行CRUD,宿主对象就不再提供add/remove/update方法了。如果是非聚合根,特别是值对象,对他们的CRUD往往是直接由它们的宿主对象来实现的。这时需要宿主对象提供 add/remove/update 方法,这些方法会通过domain event模式将对象直接持久化到数据库。注意:这里不存在级联的说法。任何通过java collection add/remove/update 元素的做法都会导致整个集合被加载。这是不能容许的。

 

5.对于DataAccessBasedCollection和普通集合的取舍

如果我们舍弃通过普通集合来映射多端实体,那将让我们失去hibernate提供的对这些集合处理的所有好处,比如:缓存,级联操作等等。

如果要对大型集合做映射,一定要控制对这些集合的任意访问。如果某些操作需要通过集合来完成, 比如CRUD集合中的元素,或是遍历集合找出某些特定的元素,这操作是不适宜由领域对象来完成了,即使它们可能带有一定的业务逻辑。这些操作可能会通过某些service方法来单独处理吧?

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

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
Hibernate缓存与集合性能分析

Hibernate作为一个应用级的数据访问层封装,只能在其作用范围内保持cache中数据的有效性,如果系统与第三方系统共享数据库的情况下,Hibernate的Cache机制可能失效。 Hibernate在本地JVM中维...

疯子船长
2015/10/26
0
0
最全java学习路线图 java学习指南

JavaEE学习路线图 准备篇 适用/适合人群:适合基础小白 目标:掌握JavaSE。 ●技术点小节: 1.开发工具的安装配置的介绍 2.JDK安装 3.DOS环境编程 4.Eclipse的安装使用 ●JAVA基础 1.基本的语...

耳东陈_f1e5
01/14
0
0
Java Web学习计划

--- 本月为入门阶段,从零开始,一步一步的做出一个实用的网站。 深入学习Java语言,初步掌握前端技术,使用JSP和MySQL完成一个简单的网站 第1周 Java高级编程学习目标:
1.深入了解JDK环境...

SVD
2016/12/01
55
0
Hibernate技术参考文档3.2

http://www.thinksaas.cn/manual/hibernate/#configuration-optional-cacheprovider 3.2 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate......

不知道起什么名字
2016/09/07
21
0
hibernate 如何实现延迟加载

延迟加载: 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了 对实体对象的延迟加载以及对集合...

bowl154
2010/12/17
0
2

没有更多内容

加载失败,请刷新页面

加载更多

iOS补位动画、沙漏效果、移动UITableViewCell、模拟贪吃蛇、拖拽进度等源码

iOS精选源码 JHAlertView - 一款黑白配色的HUD之沙漏效果 继承UIButton的自定义按钮SPButton 用递归算法实现iOS补位动画 iOS 长按移动UITableViewCell JHLikeButton - 有趣的点赞动画 兼容X...

Android爱开源
7分钟前
0
0
08.Beetl自定义方法以及直接访问java类方法---《Beetl视频课程》

本期视频实现了发布评论时间自定义显示; 内容简介:使用了自定义方法以及直接访问java方法实现了发布时间自定义显示 一起学beetl目录:https://my.oschina.net/u/1590490?tab=newest&catal...

Gavin-King
7分钟前
0
0
上币至iamToken

https://github.com/consenlabs/token-profile 点击Fork按钮,插入到自己的github项目中 cd /Users/shijun/Desktop/blockChain/iamToken git clone https://github.com/yellmi1983/token-pro......

八戒八戒八戒
10分钟前
0
0
spark——sparkCore源码解析之RangePartitioner

HashPartitioner分区可能导致每个分区中数据量的不均匀。而RangePartitioner分区则尽量保证每个分区中数据量的均匀,将一定范围内的数映射到某一个分区内。分区与分区之间数据是有序的,但分...

freeli
10分钟前
1
0
常用的ES6语法

什么是ES6?   ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。Mozilla公司将在这个标准的基础上,推出JavaScript 2.0。   ECMAScript和JavaScr...

peakedness丶
14分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部