2014-09-22 4 views
1

Я пытаюсь загрузить JSON из документов в представлении и в конечном итоге демонстрирую дополнительную сетку данных, дополненную доджо. существует около 1000 документов, и мне нужно проверить несколько строк данных. Это устаревшее приложение, и документы могут содержать сведения о 80 разных пользователях. Таким образом, мой код будет генерировать 80000 строк Json в худшем случае. Сейчас он может загружать записи 70k + из 980 документов. Мой нынешний подход заключается в создании целого JSON и записи в переменной JS в браузере, который работает, но медленный, как ожидается. Для Java для создания JSON требуется около 45-80 секунд.xpages load json из документов

Я изменил подход к загрузке NotesDocument как JSON и проанализировал его на клиенте. Таким образом, мой код java будет проходить только в 980 раз. Я использую document.generateXML() для генерации XML, а затем метод org.json.XML.toJSONObject() (это из jar-файла json.org), чтобы преобразовать его в JSON. Это тоже работает, но кажется, что он медленнее, чем первый подход.

Я не уверен, как еще я могу загрузить эти данные в браузер.

БОЛЬШОЙ вопрос: код Java начинает выполняться очень долго после того, как я открою Xpage. Он вызван событием 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()); 
     } 
    } 

} 
+0

Вы когда-нибудь думали использовать управляемый компонент в области видимости. И перейдите непосредственно JSON от Управляемого компонента EL к datagrid и не храните его intermiddiatly в переменной sessionScope –

+0

Спасибо Frank. Я имею в виду использовать bean-компоненты, но не уверен, как начать esp, потому что я недавно начал использовать xpages в другом устаревшем приложении. Также я не использую управление сетью данных. Я создал его программно, потому что я хотел показать значения столбца в параметрах фильтра, которые каким-то образом не работали с использованием управления додзе extlib. – Arun

ответ

2

Я рекомендую использовать службу xe: viewItemFileService в службе Rages XPages. Это вернет JSON и вам не придется переходить к XML-конверсии JSON, о которой вы говорили. Кроме того, возвращать только 50-100 записей за раз, я нашел, что это лучший компромисс между скоростью и количеством возвращаемых данных. Да, вам придется настраивать бесконечную прокрутку или подкачку, но это того стоит, так как люди не будут рады ждать 45 - 80 секунд, чтобы получить что-то на экране. Вы хотите снимать за < 3 секунды.

Если вы полны решимости написать свою собственную доставку JSON, убедитесь, что вы только вернули то, что абсолютно необходимо, чтобы сделать текущую страницу пригодной для использования. Также взгляните на OpenNTF Domino API, этот проект имеет метод Document.toJSON(), который является огромным временем сохранения и сокращения размера кода. Не говоря уже о правильной реализации API коллекций Java для циклического перемещения по коллекциям.

Что касается хранения этих данных в sessionScope, вы представляете здесь огромную проблему масштабируемости. Вы должны учитывать, что эти данные могут храниться в памяти для каждого пользователя вашего приложения. Это отличный способ разбивать сервер или, как минимум, ухудшать производительность, поскольку все больше и больше пользователей используют систему.

Вы также можете захотеть взглянуть на эти ресурсы сообщества:

Что касается задержки, я вижу пару вещей в вашем коде:

  • Индекс View не может быть создан. Если ваше представление имеет @Now или @Today в любой из формул выбора или столбца, индекс будет перестраиваться каждый раз, когда вы получаете доступ к представлению. В зависимости от размера представления это может быть настоящим узким местом производительности.
  • Возможно, вы захотите использовать ViewNavigator вместо коллекции документов.
  • Использовать ViewEntry и значения столбцов вместо открытия документа. Открытие документа - очень дорогостоящая операция при переполнении 1000-х документов
Смежные вопросы