`
sameseam
  • 浏览: 23375 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

万不得已不要使用ORM延迟加载(Lazy Loading)

 
阅读更多

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

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lovingprince/archive/2009/12/28/5089823.aspx

chuan122345发表于2009年12月29日 8:40:44IP:举报
这类问题很普遍,最好的方法是ORM框架只做映射,不做关联,关联还是写程序手动控制,虽然麻烦,但是性能方面好控制,用ibatis吧。
分享到:
评论

相关推荐

    mybatis延迟加载样例

    在实际开发中,为了提高性能和减少内存消耗,MyBatis提供了延迟加载(Lazy Loading)功能。延迟加载允许我们在真正需要数据时才去加载关联的对象,而不是在查询主对象时一次性加载所有关联数据。 标题中的“mybatis...

    Hiberbate 3延迟加载(Lazy)介绍

    ### Hibernbate 3 延迟加载(Lazy)深入解析 #### 一、什么是Hibernbate 3的延迟加载? Hibernbate是Java领域中非常成熟和强大的对象关系映射(ORM)框架,它提供了从Java应用到数据库的持久化层的解决方案。在...

    hibernate延迟加载解决

    在大型项目中,由于数据量庞大,为了提高性能和减少数据库的负载,Hibernate引入了“延迟加载”(Lazy Loading)机制。标题和描述提到的“hibernate延迟加载解决”主要涉及如何理解和解决与之相关的常见问题。 **1....

    延迟加载技术

    延迟加载技术,也被称为懒加载(Lazy Loading),是一种优化程序性能和资源管理的策略,尤其在大型应用和数据密集型项目中广泛使用。其核心思想是推迟非必要资源的加载,直到用户真正需要它们时才进行加载。这种技术...

    Hibernate延时加载与lazy机制.doc

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

    延迟加载、迫切加载的用法

    延迟加载(Lazy Loading)和迫切加载(Eager Loading)是两种常见的数据加载策略,它们分别适用于不同的场景和需求。 延迟加载,顾名思义,是指在实际需要时才加载数据或资源。这种技术在网页开发、数据库设计和...

    Hibernate延迟加载

    延迟加载(Lazy Loading)策略允许我们仅在需要访问一个对象或其属性时才从数据库加载它们,而不是在初始加载实体时就一次性加载所有数据。这种机制可以避免在不必要的时候消耗额外的数据库资源,特别是当数据量大...

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

    其中,延迟加载(lazy loading)是一项重要的特性,它能够有效优化应用程序的性能和资源消耗。本文将深入探讨Hibernate中的延迟加载机制及其背后的代理模式原理。 #### 二、延迟加载概述 延迟加载是一种用于提高系统...

    11_JPA详解_JPA中的一对多延迟加载与关系维护.zip

    延迟加载(Lazy Loading)是JPA提供的一个性能优化策略。默认情况下,当一个实体被加载时,与其关联的实体并不会立即加载,除非显式调用了获取这些关联实体的属性。这有助于减少数据库查询,提高应用程序的性能,...

    Laravel开发-eloquent-log-lazy-loading

    本话题主要关注Eloquent中的一个特性——延迟加载(lazy loading)以及如何记录或禁用它。延迟加载是一种优化策略,用于在需要时才加载关联的数据,而不是在查询时一次性加载所有数据,以此来提高性能。 1. Eloquent...

    MyBatis懒加载(延迟加载)

    1. **懒加载的概念**:懒加载是ORM框架中的一个特性,它的主要目的是在不必要时避免加载全部数据,只有在需要关联的对象时才执行额外的数据库查询。这样可以显著提升程序运行效率,尤其是处理大数据量时。 2. **...

    06_传智播客JPA详解_大数据字段映射与字段延迟加载

    接下来,我们讨论字段的延迟加载(Lazy Loading)。在ORM中,延迟加载是一种优化策略,它避免了一次性加载所有关联数据,而是只在真正需要时才加载。在JPA中,如果我们有一个实体类与另一个实体类有一对多或多对一的...

    Hibernate 延迟加载

    而延迟加载(Lazy Loading),作为Hibernate提供的一种优化策略,旨在减少数据库访问,提高应用程序的性能。 #### 延迟加载与非延迟加载对比 - **非延迟加载**:在非延迟加载中,当读取一个对象时,与该对象相关的...

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

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

    11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护

    二、延迟加载(Lazy Loading) 延迟加载是一种优化策略,它只在真正需要数据时才执行数据库查询。在JPA中,为了实现延迟加载,我们可以将`fetch`属性设置为`FetchType.LAZY`。默认情况下,JPA的关系加载是即时的...

    ef三种加载方式.docx

    在 EF 中,关联实体的加载有三种主要方式:延迟加载(Lazy Loading)、预先加载(Eager Loading)和显式加载(Explicit Loading)。 ### 延迟加载 (Lazy Loading) 延迟加载是指在访问导航属性时,而不是在获取主实体时才...

    Hibernate延迟加载案例 (多: 一: 一,附代码)

    本案例主要探讨的是Hibernate的延迟加载(Lazy Loading)机制,这是一种优化数据库访问性能的重要策略。延迟加载允许我们在需要数据时才去加载,而不是在初始化对象时一次性加载所有关联数据,从而减少了内存消耗和...

    属性延迟加载

    在Hibernate的ORM映射文件(通常是`.hbm.xml`文件)中,对于需要延迟加载的属性,我们需要添加`lazy="true"`属性到对应的`property`标签中。例如: ```xml ... ...

    高效使用JavaEE ORM框架

    除了基本的映射功能之外,许多ORM框架还提供了高级特性,例如“按需读取”(Lazy Loading)。这是一种延迟加载机制,即只有当真正需要访问某个属性时,ORM框架才会从数据库中获取该属性的值。例如,假设有一个`User`...

    ORM.rar_csharp orm_orm

    此外,还可以探索如何优化ORM的性能,例如通过延迟加载(Lazy Loading)、预加载(Eager Loading)或按需加载( Explicit Loading)来控制数据获取,或者利用存储过程提升性能。 总之,这个压缩包提供的C# ORM示例...

Global site tag (gtag.js) - Google Analytics