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

Xpages 获取包括类别的总视图条目-性能问题,xpages,Xpages,我正在视图控件上使用自定义页脚;例如,我有: 显示34200的1-25 我的基础视图是分类的,所以条目的总数也应该包括类别。 到目前为止,我能够找到包括类别在内的所有条目的唯一方法是使用NotesViewNavigator;但是,性能是不可接受的,因为计算这段代码大约需要27秒 我确信问题出在linevar-nav:NotesViewNavigator=view1.createViewNav()上因为我添加了一些调试器信息: start = new Date().getTime(); var v

我正在视图控件上使用自定义页脚;例如,我有:

显示34200的1-25

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

我确信问题出在line
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>"
start=newdate().getTime();
var viewPanel1:com.ibm.xsp.component.xp.XspViewPanel=getComponent(“dataView1”);
var nav:NotesViewNavigator=view1.createViewNav();
if(viewScope.vendorsch==“”| | viewScope.vendorsch==null){
var total=nav.getCount();
}否则{
var total=viewPanel1.getRowCount();//用户也可以筛选视图(使用categoryFilter属性)
}
变量from=(viewPanel1.getFirst()
有人知道如何改进这段代码吗

请注意,此视图中的文档也有Readers字段,这可能会影响 执行此操作。

您被困在。只读访问保护仅存储在文档中。因此,当您要求视图导航器获取计数时,它唯一的选择是打开所有涉及的文档,因此性能较差。阅读保护和性能是天敌(试想一下:你有一间办公室,每扇门都是锁着的,如果你有一把锁号码匹配的钥匙,你每次都要检查你所有的钥匙)

性能地狱中引入的reader字段的出路是只读取实际需要的条目()。如果用户可以基于名称、组成员身份和角色访问文档(这将使每次访问都有一次读取),这可能会有点棘手,但这仍然是非常可行的。在本例中,您将使用一个repeat控件和一个对象数据源或托管bean,因此多个过程发生在后台

额外的技巧:如果您添加一列公式1(仅数字)并将其相加,同时对其进行分类,那么您可以从naventry跳到下一个同级(这将是下一个类别),并添加数字-->所涉及的读取量大大减少,并且不会打开任何文档

再次强调:nav.count需要打开所有文档,这是一个坏主意,任何需要检查读取权限的内容都是一个坏主意,因此基于访问权限使用一个(或多个)viewNav,实际上只能读取用户可以读取的文档是一种方法

如果您需要更多提示,请告诉我。只读访问保护仅存储在文档中。因此,当您要求视图导航器获取计数时,它唯一的选择是打开所有涉及的文档,因此性能较差。阅读保护和性能是天敌(试想一下:你有一间办公室,每扇门都是锁着的,如果你有一把锁号码匹配的钥匙,你每次都要检查你所有的钥匙)

性能地狱中引入的reader字段的出路是只读取实际需要的条目()。如果用户可以基于名称、组成员身份和角色访问文档(这将使每次访问都有一次读取),这可能会有点棘手,但这仍然是非常可行的。在本例中,您将使用一个repeat控件和一个对象数据源或托管bean,因此多个过程发生在后台

额外的技巧:如果您添加一列公式1(仅数字)并将其相加,同时对其进行分类,那么您可以从naventry跳到下一个同级(这将是下一个类别),并添加数字-->所涉及的读取量大大减少,并且不会打开任何文档

再次强调:nav.count需要打开所有文档,这是一个坏主意,任何需要检查读取权限的内容都是一个坏主意,因此基于访问权限使用一个(或多个)viewNav,实际上只能读取用户可以读取的文档是一种方法


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

我尝试了几种方法,使用此循环将时间从平均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>"
start=newdate().getTime();
var viewPanel1:com.ibm.xsp.component.xp.XspViewPanel=getComponent(“dataView1”);
var nav:NotesViewNavigator=view1.createViewNav();
导航设置选项(注:查看导航器。VN_ENTRYOPT_无列值);
//禁用自动更新
view1.setAutoUpdate(错误);
if(viewScope.vendorsch==“”| | viewScope.vendorsch==null){
资产净值(400);
//var total=nav.getCount();//这可以工作,但速度很慢
//表格查找
var vwentry:NotesViewEntry=nav.getFirst();
var vwentrytmp:NotesViewEntry=null;
计数=0;
while(vwentry!=null){
计数=计数+1;
//进入并回收
vwentrytmp=nav.getNext(vwentry);
vwentry.recycle();
vwentry=vwentrytmp;
}
总数=计数;
}否则{
var total=viewPanel1.getRowCount();
}
变量from=(viewPanel1.getFirst()
我尝试了几种方法,使用此循环将时间从平均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>"
start=newdate().getTime();
var viewPanel1:com.ibm.xsp.component.xp.xsp