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-我刚才偶然发现了这一点,并且忘记了!!非常感谢您的提醒!