📄 collection-performance.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Chapter 13. 理解集合类的性能(Understanding Collection Performance)</title><link rel="stylesheet" href="../styles/html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.60.1"><link rel="home" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="up" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="previous" href="performance.html" title="Chapter 12. 性能提升(Improving Performance)"><link rel="next" href="query-criteria.html" title="Chapter 14. 条件查询(Criteria Query)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 13. 理解集合类的性能(Understanding Collection Performance)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="performance.html">Prev</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="query-criteria.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="collection-performance"></a>Chapter 13. 理解集合类的性能(Understanding Collection Performance)</h2></div></div><div></div></div><p> 我们已经在集合类(collections)上面花了很多口舌了。这一章,我们要着重关注集合类在运行时的一些问题。 </p><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collection-performance-taxonomy"></a>13.1. 分类(Taxonomy)</h2></div></div><div></div></div><p>Hibernate定义了三种不同的基本集合类</p><div class="itemizedlist"><ul type="disc"><li><p>值集合</p></li><li><p>一对多关联</p></li><li><p>多对多关联</p></li></ul></div><p> 这个分类方法是根据不同的表和外键关系来区分的,但是没有确切的告诉我们关系模型。要完整的了解关系结构和性能的区别,我们必须考虑Hibernate再更新或者删除集合类记录时的主键结构。这样的话,我们会得到如下的分类: </p><div class="itemizedlist"><ul type="disc"><li><p>有序集合类</p></li><li><p>集合(sets)</p></li><li><p>包(bags)</p></li></ul></div><p> 所有的有序集合类(map,list,array)都有一个由<tt class="literal"><key></tt>和<tt class="literal"><index></tt>组合的主键字段。这种集合类的更新非常高效——主键有效地排了序,Hibernate要更新或者删除一个元素的时候可以很高效的找到它。 </p><p> 集合(Sets)有一个由<tt class="literal"><key></tt>和某个元素字段组成的主键。对于某些元素类型,特别是组合元素以及大本文、二进制字段,效率会来的比较低;数据库无法对复杂的主键有效索引。另一方面,对一对多关系或者多对多关系来说,特别是使用“人造”的标识符的时候,它的性能同样出色。(注:如果你希望<tt class="literal">SchemaExport</tt>为你创建一个<tt class="literal"><set></tt>的主键,你必须把所有的字段都声明成<tt class="literal">non-null="true"</tt>。) </p><p> 包(Bags)是最差劲的。因为包允许元素值重复,也没有索引字段,所以无法定义主键。Hibernate没有办法来区分重复的行。Hibernate的处理方法是,每当更改的时候,完全删除(用一个<tt class="literal">DELETE</tt>),再重新创建这个集合类。这可能是效率极低的。 </p><p> 请注意,对于一对多关联,"主键"可能不是数据库表的物理主键——当时就算考虑这种情况,上面分类描述仍然是正确的。(反映了Hibernate是如何在不同的集合类中“定位”某条记录的。) </p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="collection-performance-mostefficient-1"></a>13.2. Lists, maps 和sets用于更新效率最高</h2></div></div><div></div></div><p> 根据我们上面的讨论,显然有序类型和大多数set可以在增加/删除/修改元素的时候得到最好的性能。 </p><p> 但是,在多对多关联,或者对值元素而言,有序集合类比集合(set)有一个好处。因为<tt class="literal">Set</tt>的结构,如果“改变”了一个元素,Hibernate并不会<tt class="literal">UPDATE</tt>这一行。对<tt class="literal">Set</tt>来说,只有<tt class="literal">INSERT</tt>和<tt class="literal">DELETE</tt>才有效。注意这一段描述对一对多关联并不适用。 </p><p> 注意到数组无法延迟转载,我们可以得出结论,list, map和set是最高效的集合类型。(当然,我们警告过了,由于集合中的值的关系,set可能性能下降。) </p><p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -