簡體   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