데이터 레코드가 5000 개 이상인 표가 있습니다. 이 데이터는 매일 계속 증가하고 있습니다. 표를 그리는 페이지를로드 할 때 그리드가 한 번에 10 개의 행을 표시해야하는 데이터를 표시하기까지는 거의 1 분이 걸립니다.jqGrid로 지연로드를 구현할 수 있습니까?
이 jqGrid를 사용하여 지연로드를 구현할 수 있습니까?
이
는 JSON 문자열 생성하는 내 작업입니다 :@RequestMapping(value = "studentjsondata", method = RequestMethod.GET)
public @ResponseBody String studentjsondata(HttpServletRequest httpServletRequest) {
Format formatter = new SimpleDateFormat("MMMM dd, yyyy");
String column = "id";
if(httpServletRequest.getParameter("sidx") != null){
column = httpServletRequest.getParameter("sidx");
}
String orderType = "DESC";
if(httpServletRequest.getParameter("sord") != null){
orderType = httpServletRequest.getParameter("sord").toUpperCase();
}
int page = 1;
if(Integer.parseInt(httpServletRequest.getParameter("page")) >= 1){
page = Integer.parseInt(httpServletRequest.getParameter("page"));
}
int limitAmount = 10;
int limitStart = limitAmount*page - limitAmount;
List<Student> students = Student.findAllStudentsOrderByColumn(column,orderType,limitStart,limitAmount).getResultList();
List<Student> countStudents = Student.findAllStudents();
double tally = Math.ceil(countStudents.size()/10.0d);
int totalPages = (int)tally;
int records = countStudents.size();
StringBuilder sb = new StringBuilder();
sb.append("{\"page\":\"").append(page).append("\", \"records\":\"").append(records).append("\", \"total\":\"").append(totalPages).append("\", \"rows\":[");
boolean first = true;
for (Student s: students) {
sb.append(first ? "" : ",");
if (first) {
first = false;
}
sb.append(String.format("{\"id\":\"%s\", \"cell\":[\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"]}",s.getId(), s.getId(), s.getFirstName(), s.getLastName(), formatter.format(s.getDateOfBirth().getTime()), s.getGender(), s.getMaritalStatus()));
}
sb.append("]}");
return sb.toString();
}
을 그리고 이것은있는 jqGrid와 페이지입니다 :
$("#studentGrid").jqGrid({
url: '/starburst/programmes/studentjsondata',
datatype: 'json',
height: 'auto',
colNames:['id','First Name', 'Last Name', 'Date Of Birth', 'Gender', 'Marital Status'],
colModel:[
{name:'id',index:'id', width:15},
{name:'firstName',index:'firstName', width:30, formoptions:{elmprefix:'(*) '}, editable:true, edittype: 'text', editrules:{required:true}},
{name:'lastName',index:'lastName', width:30, formoptions:{elmprefix:'(*) '}, editable:true, edittype: 'text',editrules:{required:true}},
{name:'dateOfBirth',index:'dateOfBirth', width:30, formoptions:{elmprefix:'(*) '},editrules:{required:true}, editable:true, edittype: 'text',
editoptions: {
dataInit: function(element) {
$(element).datepicker({dateFormat: 'MM dd, yy'})
}
}
},
{name:'gender',index:'gender', width:30, formoptions:{elmprefix:'(*) '}, editable:true, editrules:{required:true}, edittype: 'select',
editoptions:{value:{}}
},
{name:'maritalStatus',index:'maritalStatus', width:30, formoptions:{elmprefix:'(*) '}, editable:true, editrules:{required:true}, edittype: 'select',
editoptions:{value:{}}
}
],
rowNum:10,
autowidth: true,
pager: '#pager',
sortname: 'id',
viewrecords: true,
sortorder: "desc",
caption:"Students",
emptyrecords: "Empty Records",
subGrid: true,
/* <![CDATA[ */
onSelectRow: function(id){
if((lastsel != 0)&&(id!==lastsel)){
$("#studentGrid").jqGrid('collapseSubGridRow', lastsel);
}
lastsel=id;
}/* ]]> */
});
$("#studentGrid").jqGrid('navGrid', "#pager", {edit:false,add:false,del:false,search:true},{ },{ },{ },
{
sopt:['eq', 'ne', 'lt', 'gt', 'cn', 'bw', 'ew'],
closeOnEscape: true,
multipleSearch: true,
참조 쿼리 아래 :
public static TypedQuery<tt.edu.sbcs.model.Student> findAllStudentsOrderByColumn(String column, String orderType, int limitStart, int limitAmount) {
EntityManager em = Programme.entityManager();
TypedQuery<Student> q = em.createQuery("SELECT o FROM Student AS o ORDER BY"+" "+column+" "+orderType, Student.class);
q.setFirstResult(limitStart);//used to skip the first "N" elements form the result set, it indexes results form zero
q.setMaxResults(limitAmount);
return q;
}
제한 금액 나는 위의 행동을 취했다. 이 값은 10입니다.
병목 현상이 발생한 곳을 보려고 했습니까? JS/HTML 렌더링 또는 서블릿 핸들러 코드에서? 메소드에 시간 계산을 추가하고 실행하는 데 걸리는 시간을 인쇄 할 수 있습니다. 적어도 당신은 개선해야 할 부분을 알고있을 것입니다. 내가 본 것으로부터 findAllStudents는 개체를 카운트하는 데 매우 비효율적 인 방법으로 보입니다 (카운트 쿼리는 훨씬 더 효과적입니다). 또한 다음 페이지를 가져올 때 이전 페이지가 아닌 해당 페이지의 객체 만 가져와야합니다 (객체 10부터 20까지만 가져오고 1에서 20까지만 가져 오기) –
방화광을 사용하여 걸리는 시간을 감지합니다 실행 .. 현재 약 46s. 당신이 진술 한대로 객체를 가져 오는 방법을 모르겠습니다. 이것을 달성하는 방법을 조언 해 줄 수 있습니까? – pundit
어떤 기술을 사용하고 있습니까? JDBC를 통한 원시 SQL? JPA? 최대 절전 모드? 다른 것? 그것은 또한 DB의 유형에 의존합니다 : MySQL, PostgresQL, Oracle, H2, HSQL, 등등 ...? Firebug는 좋은 도구이지만 Java 메소드의 실행 시간을 측정하려 했습니까? 최적화하고 싶다면 병목 현상을 실제로 최적화해야하므로 먼저 Java 코드에 문제가 있는지 확인해야합니다. 메소드의 처음과 끝 사이의'System.currentTimeInMillis()'사이의 간단한 차이는 그것을해야한다. –