2011-06-02 2 views
0

Je fais une enquête sur jqgrid, tout fonctionne bien, jusqu'à ce que je charge les énormes données qui contiennent environ 1M lignes dans la base de données, jqgrid ne s'affiche pas maintenant, quand je réduire les lignes de la base de données 100K, les données s'afficheront, mais j'ai encore besoin de rafraîchir la page plusieurs fois, je réduis à 10K, cela fonctionne bien, je ne suis pas sûr que le jqgrid a une taille limitée? et plus, je peux enregistrer les données dans le fichier local qui renvoie par l'URL, et le télécharger sur le serveur, et le changement de l'URL au fichier et jqgrid peut l'afficher ....Jqgrid énormes problèmes de chargement de données

Quelqu'un peut-il m'aider ? Code est ici:

<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> 

les données JSON est ci-dessous:

{ 
    "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" 
     } 
    ] 
} 

obtenir tous les comptes de base de données Oracle

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

obtenir les données

@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; 
} 

le web contrôleur qui renvoie des données à 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; 

} 

Répondre

2

Je pense que vous ne devriez pas transférer une telle quantité de données à travers le fil. JqGrid utilise un système de radiomessagerie qui vous permet de renvoyer des blocs de données à la grille.

Fondamentalement, ce que je ferais est d'implémenter une sorte de pagination de votre serveur de données.

+0

Oui, je fais pagination sur le côté serveur, je récupère 100 rangs du serveur dans 1M ligne de données une fois, semble que les données sont retournées un peu lent en raison des données sont grandes, même en réduisant les données à un row, le jqgrid ne s'affiche pas non plus. des commentaires? – Victor

+0

@Victor: Je pense que le problème est côté serveur. Votre serveur est trop occupé à récupérer 1M lignes et jqGrid attend. – LeftyX

+1

@Victor: Je pense que LeftyX ont raison. Je suppose également que vous devriez vérifier le code que vous avez utilisé pour la pagination des données. Quelle instruction SELECT sera exécutée? Combien de temps le code du serveur a pris? Quelle base de données avez-vous (MS SQL SERVER, MySQL, ...)? jqGrid utilise simplement les valeurs de 'page',' total' et 'records' de la réponse du serveur JSON. Il ne doit pas être important de savoir si vous avez 200 ou 200 000 lignes dans la base de données du serveur. Néanmoins, vous pouvez réduire la taille des données deux fois si vous utilisez 'jsonReader: {cell:" ", id:" 0 "}' et les données JSON correspondantes. En outre, je voudrais utiliser 'rowNum: 25' – Oleg

0

Enfin, les problèmes résolus, juste parce que j'utilise multiselect dans la page de la grille, le multiselect est en conflit avec le jqgrid, veuillez voir le code que j'ai mis à jour ci-dessus. Oleg réservoirs et leftyX

le code de conflit est inférieur

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

lorsque j'ai supprimé le code, les problèmes résolus. Merci tout le monde.

Questions connexes