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