2013-04-25 30 views
0

從傳統的Notes開發中,我們瞭解到在腳本中檢索Domino對象(如數據庫和視圖)無效,應避免在循環中使用。託管bean和緩存視圖查找

在XPages中,我們不能序列化Domino對象,而且我們經常會多次檢索同一個對象。我們舉一個例子,根據存儲在項目相關文檔中的項目編號檢索項目數據。該bean的作用域爲applicationScope,結果被緩存。

public class Projects{ 
     private TreeMap<String, Project> projectList; 

     public Projects() { 

     } 

     public Project getProjectInfo(String projNum) { 
       Project project = null; 
       if (projectList==null) { 
         projectList = new TreeMap<String,Project>(); 
       } 

       if (projectList.containsKey(projNum)) { 
         project = projectList.get(projNum); 
       } else { 
         try { 
           Database projDb = DominoAccess.getDatabase("projects"); 
           View v = projDb.getView("(projLookup)"); 
           ViewEntry ve = v.getEntryByKey(projNum); 
           if (ve != null) { 
             project = new Project(ve); 

             projectList.put(projNum, project); 
           } 
         } catch (Exception e) { 
         } 
       } 

       return project; 
     } 
} 

當這首次用於例如重複時,將爲每個文檔創建數據庫和視圖對象。這是最佳實踐還是有更好的解決方法?

我知道我們可以在第一次使用時將所有項目放入Map中,但也不確定這是否是關於內存的最佳實踐?

+1

只是幾個麪包屑尋找:你的bean可以實現地圖界面和大部分的邏輯去得到()方法;使用延遲初始化和/或內部的WeakHashMap來節省內存。 – 2013-04-25 13:09:30

回答

0

當您在重複控制中使用它(例如30次)時,可以使用@xLookup 30倍。這似乎不是很有效。你可以做什麼:使用視圖導航器來快速讀取所有具有ID和單個地圖的項目。然後,不要做一個@DBLookup,而是從地圖獲得UNID,並執行getDocumentByUNID來加載它。這應該會更快。 另一種變體 - 如果您的項目數據不是太大:將JSON表示保存到一個字段並將其放入視圖導航器中。這樣你只需要閱讀一個視圖(再次你有2個變化順序讀取或通過搜索)和一個字段。

讓我知道如果我需要進一步明確

+0

#Frantisek,感謝關於WeakHashMap的想法,我不知道這件事。將看看這個。 #stwissel,我們一直在研究這個問題,但更重要的是要看看我們是否可以改進使用EL。 我們希望做的是找到緩存我們經常用於查找的數據的最佳方式,並且我們可以像這樣使用EL: value =「#{project.byNum [row.projNum] .name}」 – Fred 2013-04-26 09:45:23

+0

地圖界面是他們在這裏的關鍵。但從查找開始。他們更昂貴。 EL#{project.byNum [x]}轉換爲project.getByNum()。getValue(x)。所以你的getByNum需要返回一個實現了地圖接口的對象,所以getValule的工作 – stwissel 2013-04-26 15:49:19

+0

好吧,謝謝你的輸入 – Fred 2013-04-27 14:48:26