2013-04-25 37 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