`
tsmood
  • 浏览: 43701 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Hibernate 延迟加载剖析与代理模式应用

阅读更多
#Hibernate 延迟加载剖析与代理模式应用
Link: http://www.ibm.com/developerworks/cn/java/j-lo-hibernatelazy/index.html
简介: Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术。这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录。通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销。Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势。
……
<set name=”addresses” table=”person_address” lazy=”true”>
<!– 指定关联的外键列 –>
<key column=”person_id”/>
<composite-element class=”Address”>
<!– 映射普通属性 detail –>
<property name=”detail”/>
<!– 映射普通属性 zip –>
<property name=”zip”/>
</composite-element>
</set>
……
熟悉 Hibernate 集合属性读者应该记得:Hibernate 要求声明集合属性只能用 Set、List、Map、SortedSet、SortedMap 等接口,而不能用 HashSet、ArrayList、HashMap、TreeSet、TreeMap 等实现类,其原因就是因为 Hibernate 需要对集合属性进行延迟加载,而 Hibernate 的延迟加载是依靠 PersistentSet、PersistentList、PersistentMap、PersistentSortedMap、PersistentSortedSet 来完成的——也就是说,Hibernate 底层需要使用自己的集合实现类来完成延迟加载,因此它要求开发者必须用集合接口、而不是集合实现类来声明集合属性。
Hibernate 对集合属性默认采用延迟加载,在某些特殊的情况下,为 <set…/>、<list…/>、<map…/> 等元素设置 lazy=”false”属性来取消延迟加载。
……
Hibernate 的延迟加载(lazy load)本质上就是代理模式的应用,我们在过去的岁月里就经常通过代理模式来降低系统的内存开销、提升应用的运行性能。Hibernate 充分利用了代理模式的这种优势,并结合了 Javassist 或 CGLIB 来动态地生成代理对象,这更加增加了代理模式的灵活性,Hibernate 给这种用法一个新名称:延迟加载。无论怎样,充分分析、了解这些开源框架的实现可以更好的感受经典设计模式的优势所在。

#懒加载
在Web应用程序中,系统的瓶颈常在于系统的响应速度。如果系统响应速度过慢,用户就会出现埋怨情绪,系统的价值也因此会大打折扣。因此,提高系统响应速度,是非常重要的。
Web应用程序做的最多就是和后台数据库交互,而查询数据库是种非常耗时的过程。当数据库里记录过多时,查询优化更显得尤为重要。为了解决这种问题,有人提出了缓存的概念。缓存就是将用户频繁使用的数据放在内存中以便快速访问。在用户执行一次查询操作后,查询的记录会放在缓存中。当用户再次查询时,系统会首先从缓存中读取,如果缓存中没有,再查询数据库。缓存技术在一定程度上提升了系统性能,但是当数据量过大时,缓存就不太合适了。因为内存容量有限,把过多的数据放在内存中,会影响电脑性能。而另一种技术,懒加载可以解决这种问题。
懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能够在用户滚动页面的时候自动获取更多的数据,而新得到的数据不会影响原有数据的显示,同时最大程度上减少服务器端的资源耗用。
考虑这样一个例子:海尔电器是一个非常大的组织机构,它下有1万多个组织单元。由于组织单元的复杂性,组织单元间也存在着上下级关系。现在的问题是:用户想加入海尔电器的某个组织单元,他该怎么选择到这个组织单元呢?
很容易想到的一个解决方法是:查询数据库,把海尔电器的所有组织单元放到一个下拉列表中,让用户选择即可。这样的确是解决问题了,但是,测试发现,浏览器在显示组织单元数据时就直接假死了。看来,这样做性能太差,可以不采纳。
另一个解决方法就是利用懒加载技术。由于组织单元间存在着上下级关系,那么组织单元的排列就可以当作一棵树来处理。在显示数据时只显示父节点,点击父节点时,就能显示父节点下的子节点。
用户要选择某个组织单元,只需点击该组织单元的父亲节点就能找到该组织单元。
可以看出,懒加载提高了系统响应时间,提升了系统性能,非常具有利用价值。
分享到:
评论

相关推荐

    hibernate 延迟加载深入剖析

    ### Hibernate延迟加载深入剖析 #### 一、概述 在现代软件开发中,特别是与数据库交互的应用场景下,Hibernate作为一款流行的Java持久层框架,提供了多种高效处理数据的技术。其中,延迟加载(Lazy Loading)是一...

    2022年Hibernate面试题剖析.doc

    Hibernate 是一个流行的开源对象关系映射(ORM)框架,它为 Java 程序员提供了一种方便的方式来操作数据库,通过将 Java 类与数据库表进行映射,使得程序员可以用面向对象的方式来处理数据。ORM 技术消除了传统 JDBC...

    hibernate src

    例如,Hibernate利用CGLIB或Java代理技术实现延迟加载(Lazy Loading),当试图访问一个未加载的关联属性时,才触发数据库查询。 此外,Hibernate的缓存机制也是其性能提升的关键。一级缓存是每个Session内部的缓存...

    hibernate-orm-master.zip

    《深入剖析Hibernate ORM框架》 Hibernate,作为Java领域中的一款著名ORM(对象关系映射)框架,极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑,而非底层的SQL语句。本篇将从源码的角度,对Hibernate...

    harnessing_hibernate3 源码和书

    7. **懒加载和级联操作**:Hibernate支持懒加载策略,延迟加载关联的对象,以提高性能。级联操作则可以一次处理对象及其关联对象的保存、删除等操作。 8. **第二级缓存和查询缓存**:Hibernate的缓存机制可以显著...

    hibernate-orm-3.3源码

    六、懒加载与代理 Hibernate 支持懒加载(Lazy Loading),即延迟加载关联对象,直到真正需要时才从数据库加载,有效避免了"数据溢出"问题。它通过生成代理对象实现这一功能。 七、事件监听器 Hibernate 提供了一套...

    hibernate源码

    《深入剖析Hibernate源码》 Hibernate,作为一款广泛使用的开源对象关系映射(ORM)框架,为Java开发者提供了强大的数据库操作支持。它将复杂的SQL语句隐藏在对象模型背后,使得开发人员能够专注于业务逻辑,而无需...

    精通Hibernate:Java对象持久化技术详解.pdf

    《精通Hibernate:Java对象持久化技术详解》这本书深入剖析了Hibernate这一流行的Java对象关系映射(ORM)框架,旨在帮助开发者全面理解并熟练掌握Hibernate的使用。Hibernate是Java开发中的重要工具,它简化了...

    hibernate源码release-4.1.4.Final版

    《深入剖析Hibernate 4.1.4.Final源码》 Hibernate,作为一款著名的Java对象关系映射(ORM)框架,极大地简化了Java开发者在数据库操作中的工作。它通过提供对象化的数据访问接口,使得开发者可以更加专注于业务...

    hibernate-3.0.zip

    《深入剖析Hibernate 3.0:源码解析与应用实践》 Hibernate,作为一个开源的对象关系映射(ORM)框架,自其诞生以来就受到了广大Java开发者们的热烈欢迎。本篇文章将针对“hibernate-3.0.zip”这一版本进行详细讲解...

    hibernate3.2.5源代码

    Hibernate支持多种持久化策略,如懒加载(Lazy Loading)、立即加载(Eager Loading)、代理(Proxy)等。源代码中的`LazyInitializationException`和`HibernateProxy`类体现了这些策略的实现。 8. **事件监听和...

    hibernate源代码的zip文件

    六、懒加载与代理 Hibernate采用懒加载策略,延迟加载关联对象,直到真正使用时才加载。这通过代理机制实现,例如,当访问一个设置了懒加载的一对多关系时,实际加载的是代理对象,只有在调用其属性时才会触发...

    hibernate-3.2源码包

    《深入剖析Hibernate 3.2源码》 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。本篇将深入探讨Hibernate 3.2的源码,揭示其内部机制,帮助开发者更好地理解和利用...

    Hibernate技术手册

    《Hibernate技术手册》是针对Java开发人员的一份详尽指南,它深入剖析了Hibernate这一流行的持久化框架。Hibernate是一个对象关系映射(ORM)工具,它简化了数据库操作,允许开发者使用面向对象的方式处理数据库交互...

    hibernate-orm-5.0源代码

    Hibernate ORM 5.0是Java领域中广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者能够以面向对象的方式处理数据。本篇文章将从以下几个方面深入解析Hibernate ORM 5.0的源代码,帮助读者...

    传智播客hibernate源码.rar

    本资料主要基于“传智播客hibernate源码.rar”进行深入剖析,旨在帮助你理解Hibernate的核心机制,提升你的编程能力。 一、Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常...

    黑马程序员 hibernate 2016版讲义和笔记(4天全)

    《Hibernate技术深度剖析——基于黑马程序员2016版讲义与笔记》 Hibernate,作为Java领域中的一个著名持久化框架,为开发者提供了强大的对象关系映射(ORM)功能,极大地简化了数据库操作。本资料集是黑马程序员...

    hibernate-3.2源码

    《深入剖析Hibernate 3.2源码》 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java开发者与数据库之间的交互。通过将Java类与数据库表进行映射,Hibernate使得对象的持久化变得直观且高效。本文将...

Global site tag (gtag.js) - Google Analytics