从getAllEntries限制NotesViewEntryCollection的最佳实践

时间:2018-01-05 02:41:51

标签: xpages lotus-notes lotus-domino

我想创建更好的Web服务,以便从分页显示NotesView集合。

我从大视图中发现了View.getAllEntries的一些性能问题。

在MongoDB上,我可以将findAll()与skip()和limit()一起使用。

我怎样才能在Domino上做到这一点?

3 个答案:

答案 0 :(得分:5)

使用ViewNavigator class。如果您正在浏览大型视图,则它比view.getAllEntries()快得多。

您可以使用ViewNavigator或类似方法获取view.createViewNav()的实例。为获得最佳性能,请在获取导航器之前致电view.setAutoUpdate(false)

您可以通过搜索网络找到更多信息。 This article看起来是个好地方。

答案 1 :(得分:1)

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import com.ibm.commons.util.io.json.JsonJavaObject;
    import lotus.domino.NotesException;
    import lotus.domino.View;
    import lotus.domino.ViewColumn;
    import lotus.domino.ViewEntryCollection;
    import lotus.domino.ViewNavigator;
    import lotus.domino.ViewEntry;

     private String consultView(View view, int counter,int position) throws Exception{
        String strValue = "";
        ViewNavigator nav;
        int count = 0;
        view.setAutoUpdate(false);
        nav = view.createViewNav();
        nav.setEntryOptions(ViewNavigator.VN_ENTRYOPT_NOCOUNTDATA);
        nav.setBufferMaxEntries(400);
        int limit = counter;
        int skippedEntries = nav.skip(position);
        String number = "";

        if (skippedEntries == position) {
            Map<Integer, String> columnNameMap = new HashMap<Integer, String>();
            for (ViewColumn col : (List<ViewColumn>) view.getColumns()) {
                if (col.getColumnValuesIndex() < 65535) {
                    columnNameMap.put(col.getColumnValuesIndex(), col.getItemName());
                }
            }
            List nodeData = new ArrayList();
            ViewEntry entry = nav.getCurrent();
            while (entry != null && count <= (limit - 1)) {
                if (!entry.isCategory()) {
                    try {
                        HashMap<String, Object> entryMap = new HashMap<String, Object>();
                        count++;
                        List<Object> columnValues = entry.getColumnValues();
                        entryMap.put("unid", entry.getUniversalID());
                        entryMap.put("position", entry.getPosition('.'));
                        entryMap.put("pos",  entry.getPosition('.'));
                        entryMap.put("userpos", count);
                        for (Integer index : columnNameMap.keySet())
                            entryMap.put(columnNameMap.get(index).toString(),columnValues.get(index));

                        nodeData.add(entryMap);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                ViewEntry tmpentry = nav.getNext(entry);
                entry.recycle();
                entry = tmpentry;
            }
            JsonJavaObject returnJSON = new JsonJavaObject();
            returnJSON.put("errorcode", 0);
            returnJSON.put("errormessage", "");

                    returnJSON.put("total",getViewCount(view));

            returnJSON.put("data", nodeData);
            strValue = returnJSON.toString();
        }
        nav.recycle();
        view.recycle();

        return strValue;
}

private int getViewCount(View view) throws NotesException {
    int count = 0;
    ViewEntryCollection entryCollection = view.getAllEntries();
    count = entryCollection.getCount();
    entryCollection.recycle();
    return count;
}
}

答案 2 :(得分:-1)

以下函数从视图中获取所有AllEntries,输出结果为JSON对象。请尝试以下操作,并告诉我它是否有效。

private String consultView(View view, int counter,int position) throws Exception{
    String strValue = "";
    ViewNavigator nav;
    int count = 0;
    view.setAutoUpdate(false);
    nav = view.createViewNav();
    nav.setEntryOptions(ViewNavigator.VN_ENTRYOPT_NOCOUNTDATA);
    nav.setBufferMaxEntries(400);
    int limit = counter;
    int skippedEntries = nav.skip(position);
    String number = "";
    int inde = 111;
    if (skippedEntries == position) {
        Map<Integer, String> columnNameMap = new HashMap<Integer, String>();
        for (ViewColumn col : (List<ViewColumn>) view.getColumns()) {
            if (col.getColumnValuesIndex() < 65535 && Utilisties.containsVar(viewObject.getRetCols(), col.getItemName())) {
                columnNameMap.put(col.getColumnValuesIndex(), col.getItemName());
            }
        }
        List nodeData = new ArrayList();
        ViewEntry entry = nav.getCurrent();
        while (entry != null && count <= (limit - 1)) {
            if (!entry.isCategory()) {
                try {
                    HashMap<String, Object> entryMap = new HashMap<String, Object>();
                    count++;
                    List<Object> columnValues = entry.getColumnValues();
                    entryMap.put("unid", entry.getUniversalID());
                    entryMap.put("position", entry.getPosition('.'));
                    entryMap.put("pos",  entry.getPosition('.'));
                    entryMap.put("userpos", count);
                    for (Integer index : columnNameMap.keySet())
                        entryMap.put(columnNameMap.get(index).toString(),columnValues.get(index));

                    nodeData.add(entryMap);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            ViewEntry tmpentry = nav.getNext(entry);
            entry.recycle();
            entry = tmpentry;
        }
        JsonJavaObject returnJSON = new JsonJavaObject();
        returnJSON.put("errorcode", 0);
        returnJSON.put("errormessage", "");
        if(viewObject.getGetCount())
                returnJSON.put("total",getViewCount(view));

        returnJSON.put("data", nodeData);
        strValue = returnJSON.toString();
    }
    nav.recycle();
    view.recycle();

    return strValue;