2017-06-12 107 views
0

這是一個很好的舊討論的時候了。大約一年前,我設計了一個web應用程序,它在一家公司的測試系統中進行管理。這意味着很多設置,設備,讀數,設置 - 你的名字 - 是持久的。這也意味着,例如當一個用戶想要加載一個包含所有測試的表格時,我真的不想從數據庫中加載150萬個讀數。java web-app中的數據訪問層

所以當然我使用了延遲加載。當用戶選擇測試並想查看結果時,所有結果都從數據庫中加載。 當時我用Eclipselink。這很有效 - 據我所知,因爲Eclipselink在嘗試獲取用lazy fetchtype註釋的內容時會自動打開一個新會話。

現在,一歲和更聰明,我正在做一些重構。一個重大的變化是離開Eclipselink Hibernate(也很好學習新東西)。突然間,我收到了很好的舊LazyInitializationException。是的,我現在看到我的DAO結構不起作用。

/** 
* The Class DAO which all the other EntityDAOS extend 
*/ 

public class DAO { 

    /** The entitymanager. */ 
    private EntityManager entitymanager; 


    /** 
    * Gets the entitymanager 
    * 
    * @return the manager 
    */ 
    public EntityManager getManager(){ 
     entitymanager = FactoryMaker.getFactory().createEntityManager(); 
     entitymanager.getTransaction().begin(); 
     entitymanager.flush(); 
     entitymanager.clear(); 
     return entitymanager; 

    } 

    /** 
    * Commit and clear the manager. 
    */ 
    public void Close(){ 
     if(entitymanager.isOpen()){ 
      if(entitymanager.getTransaction().isActive()){ 
       entitymanager.getTransaction().commit(); 
       entitymanager.clear(); 
      } 

      entitymanager.close(); 
     } 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     super.finalize(); 
    } 

} 

從下面的保存示例中可以清楚地看到,會話立即關閉。

public void SaveSomething(Something t){ 
    EntityManager manager = getManager(); 
    manager.merge(t); 
    manager.flush(); 
    Close(); 
} 

所以這顯然不是一個好的解決方案。 現在 - 在你的看法 - 爲web應用程序創建數據訪問層的最佳方式是什麼?需要延遲加載,數據庫中的數據是整個系統的基礎?

回答