Jqgrid огромные проблемы с загрузкой данных - PullRequest
0 голосов
/ 02 июня 2011

Я провожу некоторое исследование jqgrid, все работает нормально, пока я не загружу огромные данные, которые содержат около 1M строк в базе данных, jqgrid не отображается сейчас, когда я уменьшу размер строк базы данных до 100K, данные будутдисплей, но мне все еще нужно обновить страницу несколько раз, я уменьшил размер до 10K, все работает нормально, я не уверен, что размер jqgrid ограничен?и более того, я могу сохранить данные в локальном файле, который возвращается по URL-адресу, и загрузить их на сервер, а изменение URL-адреса файла и jqgrid может отобразить его ....

Может кто-нибудь помочьменя нет?Код здесь:

    <script type="text/javascript"> 
            $.jgrid.no_legacy_api = true;
            $.jgrid.useJSON = true;
            $(function() {
                $("#griddisplay").jqGrid({
                    url:'<spring:url value="/charts/search/sub"/>',
                    datatype: 'json',
                    mtype:'POST',
                    colNames:['id','time_stamp', 'user_name','name','parameter'],
                    colModel:[
                        {name:'id',index:'id',width:160},
                        {name:'time_stamp',index:'time_stamp',width:160},
                        {name:'user_name',index:'user_name',width:160},
                        {name:'name',index:'name',width:160},
                        {name:'parameter',index:'parameter', width:100}
                    ],          
                    rowNum:100,
                    rowList:[100,50,25],
                    height: 500,
                    autowidth: true,
                    rownumbers: true,
                    pager: '#pager',
                    sortname: 'time_stamp',
                    gridview: true,
                    //viewrecords: true,
                    sortorder: "asc",
                    //emptyrecords: "<fmt:message key='msg.report.table.noreport' />",
                    loadonce: false,
                    //multiselect: false,
                    //loadComplete: function() {
                    //},
                    //caption: "Video Grid",
                    jsonReader: {
                        repeatitems: false,
                        id: "id",
                        root: "rows",
                        page: "page",
                        total: "total",
                        records: "records"
                    }
                });
            });
    </script>

ниже приведены данные json:

{
    "page": 1,
    "total": 2,
    "records": 2,
    "rows": [
        {
            "id": 9901,
            "time_stamp": "2011-04-12",
            "user_name": "abcd",
            "name": "somehere",
            "parameter": "harry"
        },
        {
            "id": 9902,
            "time_stamp": "2011-04-12",
            "user_name": "abcd",
            "name": "somehere",
            "parameter": "harry"
        }
    ]
}

получить все данные из базы данных оракула

@Transactional(readOnly = true)
public long getLogbaksRecords() {
    String sql="select count(*) from test";
    long lbs=jdbcTemplate.queryForLong(sql);
    System.out.println("lbs="+lbs);
    return lbs;
}

получить данные

@Transactional(readOnly = true)
public List<LogbakBean> getLogbaks(String sidx, String sord, String rows,int p) {
    String sql="SELECT * FROM(SELECT A.*, ROWNUM RN FROM (SELECT time_stamp,parameter,user_name,name FROM test order by "+sidx+" "+sord+") A WHERE ROWNUM <= "+p*Integer.valueOf(rows)+")WHERE RN > "+(p-1)*Integer.valueOf(rows);
    System.out.println("query start"+sql);
    List<LogbakBean> lbs=jdbcTemplate.query(sql, new RowMapper<LogbakBean>(){

        public LogbakBean mapRow(ResultSet rs, int rowNum)
                throws SQLException {
            //LOG.info("getLogbaks===mapRow");
            LogbakBean lb=new LogbakBean();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String time=sdf.format(new Date(Long.valueOf(rs.getString("time_stamp"))));
            lb.setTime_stamp(time);
            lb.setParameter(rs.getString("parameter"));
            lb.setUser_name(rs.getString("user_name"));
            lb.setName(rs.getString("name"));
            lb.setId(Long.valueOf(rs.getString("RN")));
            //System.out.println("curt rows="+rs.getString(5));
            //LOG.info("getLogbaks===mapRow===finish");
            return lb;
        }

    });
    System.out.println("query end");
    return lbs;
}

веб-контроллер, который возвращает данные в jqgrid

@RequestMapping(value="/charts/search/sub",method=RequestMethod.GET)
public void searchResult(
        HttpServletRequest request,
        HttpServletResponse response,
        @RequestParam("page")String page,
        @RequestParam("rows")String rows,
        @RequestParam("sidx")String sidx,
        @RequestParam("sord")String sord) throws IOException{

    int p= Integer.parseInt(page);
    int t=Integer.parseInt(rows);
    System.out.println("p="+p+"t="+t);
    long logs=services.getLogbaksRecords();
    JSONObject obj=new JSONObject();
    obj.put("page", p);
    obj.put("total",logs%t==0?logs/t:logs/t+1);
    obj.put("records",logs);
    System.out.println("total records="+logs);
    JSONArray arr=new JSONArray();
    List<LogbakBean> lgb=services.getLogbaks(sidx,sord,rows,p);
    for(int i=0;i<lgb.size();i++){
        JSONObject o=new JSONObject();
        LogbakBean l=lgb.get(i);
        o.put("id", l.getId());
        o.put("time_stamp", l.getTime_stamp());
        o.put("user_name",l.getUser_name());
        o.put("name",l.getName());
        o.put("parameter",l.getParameter());
        arr.add(o);
        LOG.info(l.getTime_stamp()+","+l.getUser_name()+","+l.getName()+","+l.getParameter());
    }
    obj.put("rows", arr);
    response.setContentType("text/html;charset=utf-8");
    response.getWriter().write(obj.toString());
    //OutputFormat format = OutputFormat.createCompactFormat();
    //JsonWriter writer = new JsonWriter();
    //writer.
    //return obj;

}

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Я думаю, что вы не должны передавать такой объем данных по проводам.
jqGrid использует систему подкачки, которая позволяет вам возвращать порции данных в сетку.

По сути, я хотел бы реализовать своего рода разбиение на страницы на стороне вашего сервера данных.

0 голосов
/ 03 июня 2011

Наконец, проблемы решены, просто потому, что я использую множественный выбор на странице сетки, этот множественный выбор конфликтует с jqgrid, смотрите код, который я обновляю выше.танки Олег и leftyX

код конфликта ниже

$(function(){
    $.localise('ui-multiselect', {/*language: 'zh',*/ path: '<spring:url value="/resources/scripts/multiselect/" />'});
    $(".multiselect").multiselect();
});

когда я удалил код, проблемы решены.спасибо всем.

...