【问题标题】:Is there any benefit of using lazy initialization as compared to Eager?与 Eager 相比,使用延迟初始化有什么好处吗?
【发布时间】:2020-07-22 11:31:53
【问题描述】:

何时使用延迟初始化以及何时使用 Eager,即使我们使用延迟,我们将使用的变量仍将包含与以下任务相关的一些数据。那么我们如何在两者之间进行选择呢?两者之间是否存在性能和内存效率差异?

请解释任何最佳用例,因为一些线程支持渴望和一些懒惰。

【问题讨论】:

    标签: kotlin lazy-initialization


    【解决方案1】:

    总的来说,延迟加载的优点是:

    • 如果您从不需要该值,则在加载或存储它时无需支付任何速度或内存损失。
    • 启动速度更快。

    而缺点是:

    • 第一次需要该值时,您必须等待它加载完毕。
    • 以线程安全的方式访问字段通常会产生少量开销。 (这是必需的,因为您通常不希望两个不同的线程执行两次加载;并且无论如何您都不希望任何线程看到部分加载的数据。)

    在其他语言中,另一个缺点是需要额外的代码来实现最后一点,但 Kotlin 的 by lazy 让它变得非常简单!

    显然,总体收益取决于您需要该价值的可能性,以及启动延迟与以后相比的影响。

    【讨论】:

      【解决方案2】:

      这里首先要讨论的是什么是延迟加载和急切加载:

      Eager Loading 是一种在现场进行数据初始化的设计模式 延迟加载是一种设计模式,用于尽可能推迟对象的初始化 让我们通过一些示例来看看这实际上是如何工作的:

      UserLazy 类:

      @Entity
      @Table(name = "USER")
      public class UserLazy implements Serializable {
       
          @Id
          @GeneratedValue
          @Column(name = "USER_ID")
          private Long userId;
       
          @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
          private Set<OrderDetail> orderDetail = new HashSet();
       
          // standard setters and getters
          // also override equals and hashcode
       
      }
      

      OrderDetail 类:

      @Entity
      @Table (name = "USER_ORDER")
      public class OrderDetail implements Serializable {
          
          @Id
          @GeneratedValue
          @Column(name="ORDER_ID")
          private Long orderId;
          
          @ManyToOne(fetch = FetchType.LAZY)
          @JoinColumn(name="USER_ID")
          private UserLazy user;
       
          // standard setters and getters
          // also override equals and hashcode
       
      }
      

      一个用户可以有多个 OrderDetails。在急切加载策略中,如果我们加载 User 数据,它也会加载与其关联的所有订单并将其存储在内存中。

      但是,当启用延迟加载时,如果我们拉起一个 UserLazy,OrderDetail 数据将不会被初始化并加载到内存中,直到对其进行显式调用。

      在下一节中,我们将看到上面的示例是如何在 Hibernate 中实现的。

      在此处查找文章: https://www.baeldung.com/hibernate-lazy-eager-loading

      还请阅读: https://www.imperva.com/learn/performance/lazy-loading/

      【讨论】:

        猜你喜欢
        • 2014-08-23
        • 2011-11-17
        • 1970-01-01
        • 2012-10-02
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多