繁体   English   中英

与 Eager 相比,使用延迟初始化有什么好处吗?

[英]Is there any benefit of using lazy initialization as compared to Eager?

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

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

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

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

缺点是:

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

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

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

我们应该在这里讨论的第一件事是什么是延迟加载和急切加载:

急切加载是一种设计模式,其中数据初始化发生在现场延迟加载是一种设计模式,用于尽可能推迟 object 的初始化让我们通过一些示例来看看这实际上是如何工作的:

UserLazy class:

@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 class:

@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。 在急切加载策略中,如果我们加载用户数据,它还将加载与其关联的所有订单并将其存储在 memory 中。

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

在下一节中,我们将了解如何在 Hibernate 中实现上述示例。

在这里找到文章: https://www.baeldung.com/hibernate-lazy-eager-loading

并阅读此内容: https://www.imperva.com/learn/performance/lazy-loading/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM