2013-06-23 58 views
1

我看到很多地方的專家開發商建議LAZY加載持久實體爲了節省內存。你如何在你的應用程序中實際使用延遲加載?

的概念是相當清楚的:它是沒用加載你不打算使用噸的信息。

但是,在我的日常經驗中,應用這種最佳實踐根本不是微不足道的。我的意思是,如果我定義的依賴,比方說,一個DEPARTMENTEMPLOYEE之間的一個一對多的關係,這是非常有可能我需要員工的名單,而在我的業務邏輯處理Department。 這件事很常見,我發現自己在大多數情況下都使用EAGER加載。

從一個編程點,我所能做的最好是出貨吾道方法就是那樣的

public Department getDepartment(String departmentName, boolean eagerly)

其中eagerly屬性設置爲true觸發部的滿載標誌(這是默認加載的LAZY,我在事務內部調用getEmployees()加載員工列表)。

你是如何處理這個問題的?你覺得LAZY裝載舒適嗎?如果是這樣,我錯過了什麼?

編輯:

根據我想討論下面的方法,使用Hibernate @Ayman解釋。

public class Node { 
     private Node parent; 
     private Set<Node> children; 

     public getParent(){ 
      if(parent==null) 
       return Hibernate.initialize(parent); 
      return parent; 
     } 

     public getChildren(){ 
      if(children==null) 
       return Hibernate.initialize(children); 
      return children; 
     } 
    } 

這是一個可以接受的實現嗎?有什麼缺點?

+3

我懷疑這個建議是在你可以的地方使用延遲加載。這並不意味着延遲加載在所有情況下都是有用的。例如,在交易系統中,您更喜歡急切的加載並且不用擔心很多內存成本。例如32 GB這幾天的成本大約是300美元。 –

+2

認爲如果你不使用延遲加載,企業列表查詢也會加載其所有部門,這將加載其所有員工的列表,這將加載...決定什麼時候值得做一個雖然,急切的加載取決於問題。 – SJuan76

回答

1

這取決於情況。我不建議添加急切的標誌,因爲它暴露了庫的內部工作。它對用戶應該是透明的。

我通常這樣做的方式是在類中。該部門將有一份員工名單。閱讀部門時,只需閱讀部門表並將emp數組保留爲空。然後,當您必須訪問員工時,請查看列表是否已加載。應該相當容易實現,並防止庫用戶知道庫的內部。

+0

我真的很喜歡你的方法,但我問自己是否超出了休眠域的界限。我的意思是,就你的解決方案而言,即使構想一種EAGER方法也是毫無價值的。你只需要加載你需要的東西。也許我錯了,但Hibernate不負責照顧類和持久性之間的分離嗎? – MaVVamaldo

+1

我並沒有提到Hibernate。只是一個適用於延遲加載和評估的一般性評論。如果你使用的是框架,那麼一定要堅持框架設計的目標,尤其是像Hibernate這樣的框架。 – Ayman

+0

是的,你是對的。我故意假定你提到Hibernate是因爲我在使用它! XD – MaVVamaldo

相關問題