在XPage和Java

时间:2016-06-03 10:53:35

标签: xpages

我很抱歉这不是一个'编码'问题,但是在使用XPage和Java的学习路径上相当长的一段时间后,我仍然很难找到关于正确执行基础知识的确切信息。

使用Java开发XPage应用程序时,这是访问数据的最佳或最有效的方法吗?

1)设置和维护一个View,其中包含文档中每个字段的列,并通过ViewEntry.getColumnValues()检索数据.get(int);即,不访问文档并从视图中检索数据。这就是我一直在做的事情,但我的View Columns继续增加以及维护列序列的麻烦。我的理解是这是一种更快的方法。

2)只需在必要时使用View将所有内容放入文档中,但主要使用Database.getDocumentByUNID()。getItemValueAsString(“field”)而不用担心添加大量列,更容易维护,但正在访问文档放慢速度吗?

3 个答案:

答案 0 :(得分:2)

不是1)或2)。

以这种方式管理Java类中的文档数据:

  • 将Java类中的文档项一次性读入类字段
  • 也记得班级字段中的UNID
  • 阅读项目后回收文件
  • 在UNID的帮助下,每次读/写再次获取文档,然后再循环

Database.getDocumentByUNID()非常快,但只为文档而不是每个项目调用一次。

更新

正如您在评论中提到的,您拥有一个包含各种类型的50.000个文档的数据库。

我试着只阅读你真正需要的那些文件。如果你想阅读,例如客户的所有支持票证文档,您将使用包含按客户排序的支持票证的视图(不包含其他列)。您将获得带有getAllDocumentsByKey(customer, true)的文档,并将Java对象(每个基于文档)放入Map中。

您可以另外维护缓存。创建模型映射(model =文档类型的Java对象)并使用UNID作为键。这样您就可以避免两次读取/存储文档。

答案 1 :(得分:2)

这是一个非常好的问题。我首先要说的是我100%同意Knut,以及我如何编写代表文档的对象。

下面我贴了一个我通常做的代码示例。请注意,此代码使用OpenNTF Domino API,其中包括为我处理回收。所以你不会看到任何回收电话。

但正如克努特所说 - 抓住文件。得到你需要的东西然后它可以再次丢弃。当您想要保存某些内容时,只需再次获取该文档即可。在这个阶段,你甚至可以检查lastModified或者自加载它以来发生的另一次保存。

为方便起见,我重载了load()方法并添加了一个NotesViewEntry: public boolean load(ViewEntry entry){}

然后在那里我可以获取文档,如果它是特定情况使用视图列。

现在,在一次处理单个文档时,这非常有用。如果我想循环访问集合的许多文档,它的效果非常好。但是,如果你得到太多,你可能会看到一些无意中听到的事情开始放缓。我有一个应用程序,如果我" injest"像这样的30,000个文档可以变得有点慢。

我还没有很好的答案。我已经尝试了许多专栏的大视图,就像你听到的那样。我尝试使用只需要的字段创建对象的较低级别基本版本,并且更适合在viewEntry及其列上工作。我还没有很好的答案。我认为确保你懒得加载你所能做的非常重要。

无论如何,这是一个代码示例,展示了我如何构建大部分文档驱动对象。

package com.notesIn9.video;

import java.io.Serializable;
import java.util.Date;

import org.openntf.domino.Database;
import org.openntf.domino.Document;
import org.openntf.domino.Session;
import org.openntf.domino.View;
import org.openntf.domino.utils.Factory;

public class Episode implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String title;
    private Double number;
    private String authorId;
    private String contributorId;
    private String summary;
    private String subTitle;
    private String youTube;
    private String libsyn;
    private Date publishedDate;
    private Double minutes;
    private Double seconds;

    private String blogLink;

    private boolean valid;
    private String unid;
    private String unique;
    private String creator;

    public Episode() {
        this.unid = "";

    }

    public void create() {

        Session session = Factory.getSession(); // this will be slightly
                                                // different if not using the
                                                // OpenNTF Domino API
        this.setUnique(session.getUnique());
        this.setCreator(session.getEffectiveUserName());
        this.valid = true;

    }

    public Episode load(Document doc) {

        this.loadValues(doc);
        return this;

    }

    public boolean load(String key) {

        // this key is the unique key of the document. UNID would be
        // faster/easier.. I just kinda hate using them and seeing them in URLS
        Session session = Factory.getSession();
        Database currentDb = session.getCurrentDatabase();
        Database db = session.getDatabase(currentDb.getServer(), "episodes.nsf");
        View view = db.getView("lkup_episodes");
        Document doc = view.getDocumentByKey(key); // This is deprecated because
                                                    // the API prefers to use
                                                    // getFirstDocumentByKey

        if (null == doc) {
            // document not found. DANGER
            this.valid = false;
        } else {

            this.loadValues(doc);

        }

        return this.valid;

    }

    private void loadValues(Document doc) {

        this.title = doc.getItemValueString("title");
        this.number = doc.getItemValueDouble("number");
        this.authorId = doc.getItemValueString("authorId");
        this.contributorId = doc.getItemValueString("contributorId");
        this.summary = doc.getItemValueString("summary");
        this.subTitle = doc.getItemValueString("subtitle");
        this.youTube = doc.getItemValueString("youTube");
        this.libsyn = doc.getItemValueString("libsyn");
        this.publishedDate = doc.getItemValue("publishedDate", Date.class);
        this.minutes = doc.getItemValueDouble("minutes");
        this.seconds = doc.getItemValueDouble("seconds");
        this.blogLink = doc.getItemValueString("blogLink");

        this.unique = doc.getItemValueString("unique");
        this.creator = doc.getItemValueString("creator");

        this.unid = doc.getUniversalID();
        this.valid = true;

    }

    public boolean save() {

        Session session = Factory.getSession();
        Database currentDb = session.getCurrentDatabase();
        Database db = session.getDatabase(currentDb.getServer(), "episodes.nsf");
        Document doc = null;

        if (this.unid.isEmpty()) {
            doc = db.createDocument();
            doc.replaceItemValue("form", "episode");
            this.unid = doc.getUniversalID();
        } else {
            doc = db.getDocumentByUNID(this.unid);
        }

        this.saveValues(doc);
        return doc.save();

    }

    private void saveValues(Document doc) {

        doc.replaceItemValue("title", this.title);
        doc.replaceItemValue("number", this.number);
        doc.replaceItemValue("authorId", this.authorId);
        doc.replaceItemValue("contributorId", this.contributorId);
        doc.replaceItemValue("summary", this.summary);
        doc.replaceItemValue("subtitle", this.subTitle);
        doc.replaceItemValue("youTube", this.youTube);
        doc.replaceItemValue("libsyn", this.libsyn);
        doc.replaceItemValue("publishedData", this.publishedDate);
        doc.replaceItemValue("minutes", this.minutes);
        doc.replaceItemValue("seconds", this.seconds);
        doc.replaceItemValue("blogLink", this.blogLink);

        doc.replaceItemValue("unique", this.unique);
        doc.replaceItemValue("creator", this.creator);

    }

    // getters and setters removed to condense code.


    public boolean remove() {

        Session session = Factory.getSession();
        Database currentDb = session.getCurrentDatabase();
        Database db = session.getDatabase(currentDb.getServer(), "episodes.nsf");

        if (this.unid.isEmpty()) {
            // this is a new Doc
            return false;

        } else {

            Document doc = db.getDocumentByUNID(this.getUnid());
            return doc.remove(true);

        }

    }

}

答案 2 :(得分:0)

这都是关于平衡的。一切都有它的价格。大视图(案例1)减慢索引速度。每次打开文档(案例2)都会降低代码速度。

找到介于两者之间的东西。