托管bean和缓存视图查找

时间:2013-04-25 12:33:11

标签: java xpages

从传统的Notes开发中我们了解到,在脚本中检索像数据库和视图这样的Domino对象是无效的,应该在循环中避免使用。

在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时将所有项目都放在Map中,但也不确定这是否是关于内存的最佳实践?

1 个答案:

答案 0 :(得分:0)

在重复控制中使用它(例如30次)时,使用30x @DBLookup。这看起来效率不高。您可以做什么:使用视图导航器快速读取所有具有id和unid的项目到地图中。然后,不是执行@DBLookup而是从地图获取UNID并执行getDocumentByUNID来加载它。那应该更快。 另一种变化 - 如果您的项目数据不是太大:将JSON表示保存到字段中并将其放入视图导航器中。这样你只需要阅读一个视图(同样你有两个顺序读取或搜索它的变体)和一个字段。

如果我需要进一步澄清,请告诉我