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