我很抱歉这不是一个'编码'问题,但是在使用XPage和Java的学习路径上相当长的一段时间后,我仍然很难找到关于正确执行基础知识的确切信息。
使用Java开发XPage应用程序时,这是访问数据的最佳或最有效的方法吗?
1)设置和维护一个View,其中包含文档中每个字段的列,并通过ViewEntry.getColumnValues()检索数据.get(int);即,不访问文档并从视图中检索数据。这就是我一直在做的事情,但我的View Columns继续增加以及维护列序列的麻烦。我的理解是这是一种更快的方法。
或
2)只需在必要时使用View将所有内容放入文档中,但主要使用Database.getDocumentByUNID()。getItemValueAsString(“field”)而不用担心添加大量列,更容易维护,但正在访问文档放慢速度吗?
答案 0 :(得分:2)
不是1)或2)。
以这种方式管理Java类中的文档数据:
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)都会降低代码速度。
找到介于两者之间的东西。