Xpages 是否重复控制、传递db和view以提高性能?
我有以下显示所有产品的重复控制:Xpages 是否重复控制、传递db和view以提高性能?,xpages,Xpages,我有以下显示所有产品的重复控制: <xp:repeat id="rptProduct" rows="16" value="#{vwProduct}" var="productRow"> <xp:panel styleClass="linkPanel" id="panel1"> <xp:text escape="false" id="imgHTML"> <xp:this
<xp:repeat id="rptProduct" rows="16" value="#{vwProduct}"
var="productRow">
<xp:panel styleClass="linkPanel" id="panel1">
<xp:text escape="false" id="imgHTML">
<xp:this.value><![CDATA[#{javascript:getImgURLForProduct(productRow.getDocument());}]]></xp:this.value>
</xp:text>
<xp:eventHandler event="onClientLoad"
submit="true" refreshMode="norefresh"></xp:eventHandler></xp:panel>
</xp:repeat>
其中getImgURLForProduct从另一个数据库构建URL:
function getImgURLForProduct(doc:NotesDocument) {
var resourceDB:NotesDatabase = session.getDatabase(getWebServer(), applicationScope.aspCRMResourceDBPath);
var strReturnVal:String = "<a style='text-decoration: none;' href='#'>";
if (resourceDB != null) {
if (resourceDB.isOpen()) {
var vwResource:NotesView = resourceDB.getView("vwLookupAttachmentsForPrimaryImg");
if (vwResource != null) {
var pictureDoc:NotesDocument = vwResource.getDocumentByKey(doc.getItemValueString("fldProductCode"), true);
if (pictureDoc != null) {
if (pictureDoc.hasItem("fldThumbImage")) {
var rtiLockPicture:NotesRichTextItem = pictureDoc.getFirstItem("fldThumbImage");
var eos:java.util.Vector = rtiLockPicture.getEmbeddedObjects();
if (eos.isEmpty() == false) {
var eosi:java.util.Iterator = eos.iterator();
while (eosi.hasNext()) {
var eo:NotesEmbeddedObject = eosi.next();
if (eo.getType() == NotesEmbeddedObject.EMBED_ATTACHMENT) {
var strImageFile:String = "/" + applicationScope.aspCRMResourceDBPath + "/0/" + pictureDoc.getUniversalID() + "/$file/" + eo.getSource();
strReturnVal += "<img src='" + strImageFile + "' alt='" + eo.getSource() + "' border='0' width='105'>";
}
}
}
}
}
}
}
}
strReturnVal += "<br /><br /><span>" + doc.getItemValueString("fldProductCode") + "</span>";
strReturnVal += "</a>";
return strReturnVal;
}
我想知道如何改进代码,使数据库和视图不会针对重复控件中的每个项目进行初始化?最好的方法是更改从中检索文档数据的数据库中的notesview。此视图包含除ofc之外所需的所有数据。richtext值,并且在该值的顶部有一列,其中包含在这段代码中生成的计算url。这样,您就不必为引用的每个文档打开辅助数据库 另一种方法是通过添加一些缓存方法来改进代码。如果getImageFromUrl方法总是在同一台服务器上打开同一个数据库等,您可以这样更改您的数据库 警告:此代码毫无戒心,没有任何错误处理
function getImgURLForProduct(doc:NotesDocument) {
var docid = doc.getUniversalID();
if(inCache(docID){
return fromCache(docid);
}
var resourceDB:NotesDatabase = session.getDatabase(getWebServer(), applicationScope.aspCRMResourceDBPath);
var strReturnVal:String = "<a style='text-decoration: none;' href='#'>";
if (resourceDB != null) {
if (resourceDB.isOpen()) {
var vwResource:NotesView = resourceDB.getView("vwLookupAttachmentsForPrimaryImg");
if (vwResource != null) {
var pictureDoc:NotesDocument = vwResource.getDocumentByKey(doc.getItemValueString("fldProductCode"), true);
if (pictureDoc != null) {
if (pictureDoc.hasItem("fldThumbImage")) {
var rtiLockPicture:NotesRichTextItem = pictureDoc.getFirstItem("fldThumbImage");
var eos:java.util.Vector = rtiLockPicture.getEmbeddedObjects();
if (eos.isEmpty() == false) {
var eosi:java.util.Iterator = eos.iterator();
while (eosi.hasNext()) {
var eo:NotesEmbeddedObject = eosi.next();
if (eo.getType() == NotesEmbeddedObject.EMBED_ATTACHMENT) {
var strImageFile:String = "/" + applicationScope.aspCRMResourceDBPath + "/0/" + pictureDoc.getUniversalID() + "/$file/" + eo.getSource();
strReturnVal += "<img src='" + strImageFile + "' alt='" + eo.getSource() + "' border='0' width='105'>";
}
}
}
}
}
}
}
}
strReturnVal += "<br /><br /><span>" + doc.getItemValueString("fldProductCode") + "</span>";
strReturnVal += "</a>";
toCache(strReturnVal);
return strReturnVal;
}
function inCache(strKey){
if(!sessionScope.containsKey("urlcache")){
sessionScope.put("urlcache",new java.util.HashMap());
}
var cache = sessionScope.get("urlcache");
cache.containsKey(strKey);
}
function fromCache(strKey){
var cache = sessionScope.get("urlcache");
return cache.get(strKey);
}
function toCache(strKey,strValue){
if(!sessionScope.containsKey("urlcache")){
sessionScope.put("urlcache",new java.util.HashMap());
}
var cache = sessionScope.get("urlcache");
cache.put(strKey,strValue);
}
通过首先检查是否存在可用于引用文档的缓存条目,您无需再次打开数据库 最好的方法是更改从中检索文档数据的数据库中的notesview。此视图包含除ofc之外所需的所有数据。richtext值,并且在该值的顶部有一列,其中包含在这段代码中生成的计算url。这样,您就不必为引用的每个文档打开辅助数据库 另一种方法是通过添加一些缓存方法来改进代码。如果getImageFromUrl方法总是在同一台服务器上打开同一个数据库等,您可以这样更改您的数据库 警告:此代码毫无戒心,没有任何错误处理
function getImgURLForProduct(doc:NotesDocument) {
var docid = doc.getUniversalID();
if(inCache(docID){
return fromCache(docid);
}
var resourceDB:NotesDatabase = session.getDatabase(getWebServer(), applicationScope.aspCRMResourceDBPath);
var strReturnVal:String = "<a style='text-decoration: none;' href='#'>";
if (resourceDB != null) {
if (resourceDB.isOpen()) {
var vwResource:NotesView = resourceDB.getView("vwLookupAttachmentsForPrimaryImg");
if (vwResource != null) {
var pictureDoc:NotesDocument = vwResource.getDocumentByKey(doc.getItemValueString("fldProductCode"), true);
if (pictureDoc != null) {
if (pictureDoc.hasItem("fldThumbImage")) {
var rtiLockPicture:NotesRichTextItem = pictureDoc.getFirstItem("fldThumbImage");
var eos:java.util.Vector = rtiLockPicture.getEmbeddedObjects();
if (eos.isEmpty() == false) {
var eosi:java.util.Iterator = eos.iterator();
while (eosi.hasNext()) {
var eo:NotesEmbeddedObject = eosi.next();
if (eo.getType() == NotesEmbeddedObject.EMBED_ATTACHMENT) {
var strImageFile:String = "/" + applicationScope.aspCRMResourceDBPath + "/0/" + pictureDoc.getUniversalID() + "/$file/" + eo.getSource();
strReturnVal += "<img src='" + strImageFile + "' alt='" + eo.getSource() + "' border='0' width='105'>";
}
}
}
}
}
}
}
}
strReturnVal += "<br /><br /><span>" + doc.getItemValueString("fldProductCode") + "</span>";
strReturnVal += "</a>";
toCache(strReturnVal);
return strReturnVal;
}
function inCache(strKey){
if(!sessionScope.containsKey("urlcache")){
sessionScope.put("urlcache",new java.util.HashMap());
}
var cache = sessionScope.get("urlcache");
cache.containsKey(strKey);
}
function fromCache(strKey){
var cache = sessionScope.get("urlcache");
return cache.get(strKey);
}
function toCache(strKey,strValue){
if(!sessionScope.containsKey("urlcache")){
sessionScope.put("urlcache",new java.util.HashMap());
}
var cache = sessionScope.get("urlcache");
cache.put(strKey,strValue);
}
通过首先检查是否存在可用于引用文档的缓存条目,您无需再次打开数据库 您可以将来自不同数据库的视图存储在dataContext中。我不确定回收安全的DataContext有多安全,但在其中存储Domino对象可能是安全的。在掌握XPages中有一个关于datacontext的好章节。这对我非常有用。您可以将来自不同数据库的视图存储在dataContext中。我不确定回收安全的DataContext有多安全,但在其中存储Domino对象可能是安全的。在掌握XPages中有一个关于datacontext的好章节。这对我非常有用。谢谢Paul-非常感谢-将进一步研究,看看我是否可以改进代码。感谢Paul-非常感谢-将进一步研究,看看我是否可以改进代码。感谢这两个选项。有了第一个选项,我就必须在PigTroc文档保存时生成URL。我猜测并更新相应的值——这是一个很好的工作,可以考虑。第二个建议也很有趣!谢谢。我决定将基于Paul建议的DataContext与您的第二个建议相结合,以缓存结果-非常感谢。我还修复了代码的问题:var docID:String=doc.getUniversalID;如果inCachedocID{returnfromCachedocid;}和toCachedocID,则strReturnVal;在我上面发布的代码的基础上,您可以使用java.lang.stringbuffer对象进一步优化它,以优化性能,如这里所述,现在实现stringbuffer-我刚才偶然发现了这一点,并且忘记了!!非常感谢您的提醒!谢谢你的两个选择。有了第一个选项,我就必须在PigTroc文档保存时生成URL。我猜测并更新相应的值——这是一个很好的工作,可以考虑。第二个建议也很有趣!谢谢。我决定将基于Paul建议的DataContext与您的第二个建议相结合,以缓存结果-非常感谢。我还修复了代码的问题:var docID:String=doc.getUniversalID;如果inCachedocID{returnfromCachedocid;}和toCachedocID,则strReturnVal;在我上面发布的代码的基础上,您可以使用java.lang.stringbuffer对象进一步优化它,以优化性能,如这里所述,现在实现stringbuffer-我刚才偶然发现了这一点,并且忘记了!!非常感谢您的提醒!