获取总视图条目,包括类别 - 性能问题

时间:2013-03-19 01:52:43

标签: xpages

我在View Control上使用自定义页脚;我有例如:

  

显示 1 - 25 34200

我的基础视图已分类,因此条目总数也应包含类别。 到目前为止,我能够找到包括类别在内的条目总数的唯一方法是使用NotesViewNavigator;但是,性能是不可接受的,因为计算这段代码需要大约27秒。

我确定问题出在第var nav:NotesViewNavigator = view1.createViewNav();行,因为我添加了一些调试器信息:

start = new Date().getTime();
var viewPanel1:com.ibm.xsp.component.xp.XspViewPanel = getComponent("dataView1");
var nav:NotesViewNavigator = view1.createViewNav();
if (viewScope.VendorSrch == "" || viewScope.VendorSrch == null){
    var total =  nav.getCount(); 
}else{          
    var total = viewPanel1.getRowCount();// View can be filtered by user as well (using categoryFilter property)
}

var from =(viewPanel1.getFirst() < total? (viewPanel1.getFirst() + 1 ) : total);
var tmpTo = viewPanel1.getFirst() + viewPanel1.getRows();
var to = (tmpTo < total? tmpTo : total);

var elapsed = new Date().getTime() - start;
print(elapsed + " ms");
"</b>Displaying <b>"+ from +"</b> - <b>"+ to + "</b> of " + "<b>"+total+"</b>"

有谁知道如何改进这段代码?

请注意,此视图中的文档也包含“读者”字段,这些字段可能会影响 这项行动的表现。

2 个答案:

答案 0 :(得分:3)

你被困在performance hell。读取访问保护仅存储在文档中。因此,当您要求您的视图导航器获取计数时,唯一的选择是打开所有涉及的文档 - 因此性能不佳。阅读保护和性能是天生的敌人(想象一下:你有一个办公室,每个门都被锁定,你可以随时移动,如果你有一个具有相应锁定号码的钥匙,你必须每次检查所有钥匙。)

读者领域的出路是性能地狱只读取你真正需要的条目(as outlined)。如果用户可以访问基于名称,组成员身份和角色的文档(每次访问可以进行一次读取),那可能会有点棘手,但它仍然非常可行。在这种情况下,您将使用重复控件和对象数据源或托管bean,因此多次传递发生在后台。

奖金技巧:如果你添加一个公式为1的列(只是数字)并将其添加,同时对其进行分类,那么你可以从naventry跳到下一个兄弟(这将是下一个类别)并添加数字 - &gt;所涉及的阅读少得多,没有文件打开。

再次强调:nav.count需要打开所有文档并且是一个不好的想法,任何需要检查读取权限的东西都是一个坏主意,所以使用一个(或多个)viewNav基于实际只读取的访问权限用户可以阅读的文件是要走的路。

如果您需要更多提示,请告诉我

答案 1 :(得分:0)

我尝试了几种方法,使用此循环将时间从平均27秒减少到2.7秒:

start = new Date().getTime();
var viewPanel1:com.ibm.xsp.component.xp.XspViewPanel = getComponent("dataView1");
var nav:NotesViewNavigator = view1.createViewNav();
nav.setEntryOptions(NotesViewNavigator.VN_ENTRYOPT_NOCOLUMNVALUES);

// disable autoupdate
view1.setAutoUpdate(false);
if (viewScope.VendorSrch == "" || viewScope.VendorSrch == null){
    nav.setBufferMaxEntries(400);       
    //var total =  nav.getCount(); // This works but slow

    // peform lookup
    var vwentry:NotesViewEntry = nav.getFirst();
    var vwentrytmp:NotesViewEntry = null;
    count = 0;
    while (vwentry != null){
        count = count + 1;       
        // Get entry and go recycle
        vwentrytmp = nav.getNext(vwentry);
        vwentry.recycle();
        vwentry = vwentrytmp;        
    }

    total = count;

}else{  
    var total = viewPanel1.getRowCount();   
}

var from =(viewPanel1.getFirst() < total? (viewPanel1.getFirst() + 1 ) : total);
var tmpTo = viewPanel1.getFirst() + viewPanel1.getRows();
var to = (tmpTo < total? tmpTo : total);

var elapsed = new Date().getTime() - start;
print(elapsed + " ms");
"</b>Displaying <b>"+ from +"</b> - <b>"+ to + "</b> of " + "<b>" + total + "</b>"