【发布时间】:2020-07-22 11:31:53
【问题描述】:
何时使用延迟初始化以及何时使用 Eager,即使我们使用延迟,我们将使用的变量仍将包含与以下任务相关的一些数据。那么我们如何在两者之间进行选择呢?两者之间是否存在性能和内存效率差异?
请解释任何最佳用例,因为一些线程支持渴望和一些懒惰。
【问题讨论】:
标签: kotlin lazy-initialization
何时使用延迟初始化以及何时使用 Eager,即使我们使用延迟,我们将使用的变量仍将包含与以下任务相关的一些数据。那么我们如何在两者之间进行选择呢?两者之间是否存在性能和内存效率差异?
请解释任何最佳用例,因为一些线程支持渴望和一些懒惰。
【问题讨论】:
标签: kotlin lazy-initialization
总的来说,延迟加载的优点是:
而缺点是:
在其他语言中,另一个缺点是需要额外的代码来实现最后一点,但 Kotlin 的 by lazy 让它变得非常简单!
显然,总体收益取决于您需要该价值的可能性,以及启动延迟与以后相比的影响。
【讨论】:
这里首先要讨论的是什么是延迟加载和急切加载:
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/
【讨论】: