`
xiaoliang330
  • 浏览: 116029 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate延迟加载 与 web应用 独立缓存架构的冲突

 
阅读更多
延迟加载(Lazy Loading)是啥玩意儿?估计地球人都知道,它的意义在于只在需要的时候才去加载必要的数据,这样可以避免即时加载所带来的不必要的系统开销(教科书是这么说的)。另外,教科书中还举了个例子。例如某个User对象在加载时会同时读取其所关联的多个地址(Address)对象,对于需要对Address进行操作的应用来说,关联数据的自动加载机制非常有效。不过呢如果我们只想要获得User的性别(sex)属性,而不关心User的地址(Address)信息,那么加载Address的特性就显得多余,并且造成了极大的性能浪费。为了获得User的性别属性,我们可能还要同时从数据库中读取数条无用的地址数据,这导致了大量无谓的系统开销,因此延迟加载就这么闪亮登场,基本上目前绝大多数的ORM都具有延迟加载的特性。

     好处如此多,为啥要慎用?




   第一,延迟加载搞不好就容易导致N+1 select问题,性能反而不能保障

   第二,延迟加载一般是在ORM中采用字节码增强方式来实现,这种方式处理后的对象往往会导致对象序列化失效,而在大型web应用中一般都会采用  独立的缓存架构,一但应用系统引入独立的缓存系统对应用数据对象进行缓存,采用延迟加载后的对象序列化将失效,导致缓存失败。

   第三,ORM中的延迟加载将业务对象的加载关系搞得不清不楚,如果某天想换ORM,那么还得针对不同的ORM处理延迟加载关系,即使不还ORM后来人想理解加载关系也会很头疼。

   第四,延迟加载目的是为了提高性能,减少系统消耗,但是目前硬件处理能力已经大大提高,对于这点系统消耗一般还是可以承受,即使说有性能问题,也可以通过增加廉价PC来均摊负载,提高性能。

  第五,从另外一方面考虑,ORM需要承担的仅仅是O R M,和事务、缓存等特性一样,它们应该由其他更有资格的家伙来承担,不需要搞那么负载,否则对于以后的底层扩展,那可是一个艰巨的工作。








建议,没有必要不要使用ORM中延迟加载特性,除非你的系统性能实在是不行了,需要延迟加载来避免这类系统消耗,那时你再考虑使用。而即使你要使用延迟加载特性,也建议你考虑清楚,是否要增加独立的应用缓存等等,有时可能根本原因在于系统的设计问题。

http://blog.csdn.net/lovingprince/archive/2009/12/28/5089823.aspx


目前开发的项目中,想应用memcached,但遭遇hibernate延迟加载的问题,导致延迟加载的对象在序列化时失败,这样缓存无法应用。(暂时想用的解决办法就是去掉延迟加载,自己实现一对多关系的关联,这个改动是有多大,可想而知,所以设计很重要。)

分享到:
评论

相关推荐

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

    《Hibernate延迟加载与代理模式解析》 在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要...

    Hibernate延迟加载以及利用Spring

    #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正需要数据时才加载数据,而不是一开始就...

    hibernate 延迟加载深入剖析

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

    什么是hibernate延迟加载

    详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助

    hibernate延迟加载解决

    标题和描述提到的“hibernate延迟加载解决”主要涉及如何理解和解决与之相关的常见问题。 **1. 延迟加载概念** 延迟加载是一种优化策略,它使得关联的对象在真正需要时才从数据库中加载,而不是在加载主对象时立即...

    hibernate一级缓存和二级缓存的区别与联系

    一级缓存是 Hibernate 内置的,默认开启,与 Session 对象关联。它是一个事务范围的缓存,也就是说,每个 Hibernate Session 对应一个一级缓存,仅在当前事务中有效。一级缓存主要存储了 Session 在当前事务中加载和...

    Hibernate延时加载与lazy机制.doc

    Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...

    【北大青鸟内部教程】jsp中关于Hibernate延时加载的问题

    在Java Web开发中,...通过学习和实践,你可以更好地掌握在JSP中应用Hibernate的延时加载,从而编写出更高效、健壮的Java Web应用。在实际开发中,应结合项目需求,灵活运用各种策略来解决延时加载带来的挑战。

    深入理解Hibernate缓存

    本文详细介绍了Hibernate中的一级缓存和二级缓存,并探讨了如何根据具体应用场景来配置不同的缓存策略。理解并合理利用Hibernate的缓存机制,可以显著提升应用的性能和响应速度。希望本文能够帮助读者更好地掌握...

    浅析Java的Hibernate框架中的缓存和延迟加载机制

    主要介绍了Java的Hibernate框架中的缓存和延迟加载机制,Hibernate是注明的Java下SSH三大web开发框架之一,需要的朋友可以参考下

    hibernate 延迟加载.docx

    1. **性能提升**:只加载应用程序实际需要的数据,减少了数据库的I/O操作,提高了响应速度。 2. **内存优化**:避免了不必要的数据加载,节省了内存资源,防止内存溢出。 **立即加载与延迟加载的对比** - **立即...

    使用struts+spring+hibernate组装你的web应用架构

    本文将探讨如何利用Struts、Spring和Hibernate这三个流行的开源框架来搭建一个松散耦合、易于维护的Web应用架构。首先,让我们逐一了解这三个框架的主要职责。 Struts作为表示层框架,主要负责管理用户的HTTP请求,...

    Hibernate 延迟加载

    ### Hibernate延迟加载详解 #### 什么是Hibernate延迟加载? 在探讨Hibernate延迟加载之前,我们先简要回顾一下Hibernate框架。Hibernate是一种流行的Java持久层框架,它提供了对象关系映射(ORM)的功能,允许...

    hibernate一级和二级缓存配置与详解

    在Java持久化框架Hibernate中,缓存机制是一个重要的性能优化手段,它能够显著减少数据库的访问次数,提高应用程序的运行效率。本篇将深入探讨Hibernate的一级缓存和二级缓存,以及查询缓存的配置和使用。 ### 一级...

    hibernate开启二级缓存和查询缓存

    在 Hibernate 中,二级缓存和查询缓存是提高应用性能的重要机制。下面将详细介绍如何开启并理解这两个缓存机制。 ### 1. 一级缓存与二级缓存 #### 1.1 一级缓存 一级缓存是 Hibernate 内置的 Session 缓存,它是每...

    Hibernate性能(缓存 延迟加载 事务 悲观 乐观锁).ppt

    Hibernate延迟加载(Lazy Loading)** 延迟加载是一种优化策略,只在真正需要数据时才执行数据库查询。例如,当实体对象的集合属性未被访问时,Hibernate不会立即加载这些数据,而是等到需要时才加载,减少不必要的...

    Hibernate延迟加载机制.zip

    Hibernate延迟加载机制.zip

    应用SpringMVC与Hibernate进行WEB开发

    应用SpringMVC与Hibernate进行WEB开发,是一种现代的、高效的Web应用程序开发方法,结合了SpringMVC框架的灵活性和Hibernate的持久化能力。下面将详细阐述这两种技术的关键知识点及其在Web开发中的应用。 ### ...

Global site tag (gtag.js) - Google Analytics