xpages从文档加载json

时间:2014-09-22 14:02:41

标签: xpages xpages-extlib org.json

我正在尝试从视图中的文档加载JSON并最终显示dojo增强型数据网格。有大约1000个文档,我需要检查多行数据。这是遗留应用程序,文档可以包含80个不同用户的详细信息。因此,在最坏的情况下,我的代码将生成80000个Json行。现在它可以从980个文档加载70k +记录。我目前的方法是创建完整的JSON并在浏览器中编写JS变量,该变量正在工作但可预测的速度很慢。 Java生成JSON大约需要45-80秒。

我更改了将NotesDocument加载为JSON并在客户端上解析它的方法。这样我的java代码只会循环980次。我使用document.generateXML()生成XML,然后使用org.json.XML.toJSONObject()方法(这是来自json.org jar文件)将其转换为JSON。这也是有效的,但似乎比第一种方法慢。

我不确定如何将这么多数据加载到浏览器中。

最大的问题是:打开Xpage后,Java代码开始执行很长时间。它在beforePageLoad事件中调用。我真的很担心。我打开xpage链接后出现第一个控制台消息(检查代码开始的日期时间)。

现在对于datagrid,我只显示30行,但问题是因为每个文档有多行数据,我不能允许用户在获取所有记录之前对网格进行排序/过滤。

这是我当前方法的后端Java代码。如果您愿意,我可以发布工作代码(第一种方法)。

import java.io.IOException;
import java.util.*;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.servlet.http.HttpServletResponse;

import lotus.domino.Database;
import lotus.domino.Document;
import lotus.domino.View;

import com.ibm.xsp.extlib.util.ExtLibUtil;
import com.ibm.commons.util.io.json.*;
import org.json.*;

/**
 * @author agnihotri.a
 * 
 */

 public class AccessRequests {
    public static void mainly() {
        Date dt1 = new Date();
        System.out.println(dt1.toString());
        System.out.println("here");
        Database database = null;
        View accReqView = null;
        Document accReqDoc = null;
        JSONArray jarr = new JSONArray();
        //try out JSONObject here
        //List <JSONObject> ljo = new ArrayList<JSONObject>();

        try {

            /**
             * we need handle current user session to compute common name in
             * user names field
             */
            // Session s = ExtLibUtil.getCurrentSession();
            database = ExtLibUtil.getCurrentDatabase();
            System.out.println("generating grid in : " + database.getFilePath());
            accReqView = database.getView("AccessRequestsGrid");

            // get access request document
            accReqDoc = accReqView.getFirstDocument();
            //int counter = 0;
            while (accReqDoc != null) {
                //counter++;
                jarr.put(org.json.XML.toJSONObject(accReqDoc.generateXML()));
                //ljo.add(org.json.XML.toJSONObject(accReqDoc.generateXML()));
                accReqDoc = accReqView.getNextDocument(accReqDoc);
            }

            ExtLibUtil.getSessionScope().put("allAccReq", jarr);
            //System.out.println(ljo.size());
            //System.out.println(counter);
            //ExtLibUtil.getSessionScope().put("totDocs", ljo.size());

        }

        catch (final Exception ex) {
            // tbd: handle exception
            ex.printStackTrace();
            System.out.println(ex.getStackTrace().toString());
            // return "An Error occured. Check with IT team.";
        } finally {
            // recycle domino objects
            KillDomObjects.incinerate(accReqDoc, accReqView, database);
            final Date dt2 = new Date();
            System.out.println(dt2.toString());
        }
    }

}

1 个答案:

答案 0 :(得分:2)

我建议在XPage REST服务中使用xe:viewItemFileService。这将返回JSON,而不必通过您提到的XML到JSON转换。此外,一次只返回50到100个条目,我发现这是速度和返回数据量之间的最佳折衷。是的,您必须配置无限滚动或分页,但它值得,因为人们不会在45到80秒之间等待屏幕上的内容。你想拍摄&lt; 3秒返回。

如果您决定编写自己的JSON传送,请确保只返回使当前页面可用的绝对必要条件。另外看一下OpenNTF Domino API,这个项目有一个Document.toJSON()方法,这是一个节省大量时间和代码大小的减少器。更不用说用于循环集合的Java Collections API的正确实现。

至于在sessionScope中存储此数据,您在此处引入了一个巨大的可扩展性问题。您必须考虑这些数据可能会存储在内存中,供应用程序的每个用户使用。这是一种使服务器崩溃的好方法,或者至少随着越来越多的用户使用该系统而降低性能。

您可能还想查看这些社区资源:

关于延迟,我在你的代码中看到了几件事:

  • 可能未构建View索引。如果您的视图在任何选择或列公式中都有@Now或@Today,则每次访问视图时都将重建索引。根据视图的大小,这可能是一个真正的性能瓶颈
  • 您可能希望使用ViewNavigator而不是文档集
  • 使用ViewEntry和列值而不是打开文档。在循环传输1000个文档时打开文档是一项非常昂贵的操作