有2张表 一张仓库表 一张物料表 仓库表中materielid 关联物料表ID 代码如下HttpServletRequest req= ServletActionContext.getRequest();
HibDao hd=new HibDao();
String hql="from Cangku";
List<Cangku> cangku=(List<Cangku>)hd.query(hql);
List<Materiel> mt=new ArrayList<Materiel>();
for (Cangku c:cangku){
String hql_b = "from Materiel where id ='"+c.getMaterielid()+"'";
List<Materiel> m=(List<Materiel>)hd.query(hql_b);
mt.add(m.get(0));
System.out.println(mt.size());

}
req.setAttribute("cangku",cangku);
req.setAttribute("mt",mt);

前面平均1秒输出个10来次 越到后面越慢 大概输出到2000+的时候就是1秒输出2-3次了 再到后面基本不动了
考虑到的确不科学 每次循环都要进行次数据连接
然后
String hql="from Cangku c , Materiel m where c.materielid = m.id";
List l=hd.query(hql);
System.out.println(l.size());
req.setAttribute("l",l);
return "success";考虑到这样写 由于数据太多 也考虑不到这样写会不会有隐患 SIZE输出数量是没错的 但是不知道每一条是否是对应的然后前台JSP
<% List l= (List)request.getAttribute("l");
   for(int i=0;i<l.size();i++)
{
然后这里不会取了。。
}
%>在线等啊  新手求指点

解决方案 »

  1.   

    批量查询?注意session缓存大小
      

  2.   

    诶。 本来是想问个HQL的问题 但是写求助的时候自己想了一下解决方法 然后变成LIST的求助了不过也没关系 问下老鸟像这样写数据一多 会出问题么 顺便把public List query(String hql){

    Session session = creatsession();
    Query q=session.createQuery(hql);
    session.getTransaction().commit();
    return q.list();
    }也贴出来 
      

  3.   

    然后LIST那里怎么写啊   一般我都是 (某个Object)list.get(i).getXXX方法取值  现在LIST里放的是2个object的合集
      

  4.   

    调试一下,看List里面是什么,应该是Object[]
      

  5.   

    <%List l=(List)request.getAttribute("l");
    System.out.print(l.size());
    Object obj = (Object)l.get(0);
    System.out.println(obj[0]);
      %>里面应该是Object 但是这样输出报错
      

  6.   

    这样写问题大session没有手动关闭把这种手动创建的session要手动关闭。。直接导致后果是:查询到后面直接卡死。
    如果不需要手动关闭。。可以使用
    /**
     * 读取发件箱短消息列表数据
     */
    @SuppressWarnings("unchecked")
    public List<SmsResp> getSmsResps(final String hsql,
    final int start, final int size) {
    return (List<SmsResp>) this.getHibernateTemplate().execute(
    new HibernateCallback() {
    public Object doInHibernate(Session session)
    throws HibernateException, SQLException {
    Query query = session.createQuery(hsql);
    query.setFirstResult(start);
    query.setMaxResults(size);
    List<SmsResp> list = query.list();
    return list;
    }
    });
    }
    这种方式,通过spring事务配置来自动关闭。
      

  7.   

    public List query(String hql){
            
            Session session = creatsession();
            Query q=session.createQuery(hql);
            session.getTransaction().commit();            
            return q.list();
        }
    这句是手动创建session
      

  8.   

    HttpServletRequest req= ServletActionContext.getRequest();
            HibDao hd=new HibDao();
            String hql="from Cangku";
            List<Cangku> cangku=(List<Cangku>)hd.query(hql);
            List<Materiel> mt=new ArrayList<Materiel>();
            for (Cangku c:cangku){
                String hql_b = "from Materiel where id ='"+c.getMaterielid()+"'";
                List<Materiel> m=(List<Materiel>)hd.query(hql_b);
                mt.add(m.get(0));
                System.out.println(mt.size());
                
            }
            req.setAttribute("cangku",cangku);
            req.setAttribute("mt",mt);
            
    这个查询 首先连接数据库的次数过多,,,用连接查询减少连数据库次数,加个分页,,最好,,,不知道你有没有加索引实在数据太大!!!没有分页,怎么搞性能都起不来
      

  9.   

    都是直接查出数据放到LIST里 然后传递到前台JSP放到GridPanel控件里分页啊。
      问题是怎么取LIST里的东西啊
      

  10.   

    听你的意思是:先取道list里,然后再将list传到前台拿出来分页,没见过这样分页的数据量大时效率低的吓人。。hibernate不是有分页参数设置么? 在数据库分页啊。
    Query query = session.createQuery(hsql);
    query.setFirstResult(start);
    query.setMaxResults(size);
    List<SmsResp> list = query.list();
    return list;
    设置一下下标和记录数,就好了。。分页在数据库进行,,效率肯定高。拿出来的list数据量也不大啊。。就算你一页分500条, 那list也不过500条数据,每次
    不知道有没有理解对你的意思、?
      

  11.   


    <script type="text/javascript">


    Ext.onReady(function(){
    <%List<Buys> buys = (List<Buys>)request.getAttribute("buys");
    List<Client> cl = (List<Client>)request.getAttribute("cl");
    List sum=(List)request.getAttribute("sum");
    String s="";
           for (int i=0;i<buys.size();i++){
           s=s+"['"+(i+1)+"',";
           s=s+"'"+((Buys)buys.get(i)).getBuycoding().toString()+"',";
           s=s+"'"+((Client)cl.get(i)).getCoding().toString()+"',";
           s=s+"'"+((Client)cl.get(i)).getShortname().toString()+"',";
           s=s+"'"+((Buys)buys.get(i)).getBuytime().toString()+"',";
           s=s+"'"+sum.get(i)+"',";
           s=s+"'"+((Buys)buys.get(i)).getBuytype().toString()+"',";
           s=s+"'"+((Buys)buys.get(i)).getSaleman().toString()+"',";
           String dis=((Buys)buys.get(i)).getDis().toString();
           s=s+"'"+((Buys)buys.get(i)).getId().toString()+"',";
          
           if(dis.equals("0")||dis=="0"){
           if((i+1)==buys.size())
           s=s+"'不生效']";
           else
           s=s+"'不生效'],";
           }else{
           if((i+1)==buys.size())
           s=s+"'生效']";
           else
           s=s+"'生效'],";
           }
          
          
          
       
          }
         
        
          %>

        var myData = [      <%=  s%>
     
        ];
    <% s=null;
    System.gc();
    %>
        // example of custom renderer function
        function change(val){
            if(val > 0){
                return '<span style="color:green;">' + val + '</span>';
            }else if(val < 0){
                return '<span style="color:red;">' + val + '</span>';
            }
            return val;
        }
     

        // example of custom renderer function
        function pctChange(val){
            if(val > 0){
                return '<span style="color:green;">' + val + '%</span>';
            }else if(val < 0){
                return '<span style="color:red;">' + val + '%</span>';
            }
            return val;
        }    // create the data store
        var store = new Ext.data.Store({
            proxy: new Ext.ux.data.PagingMemoryProxy(myData),
            remoteSort:true,
            sortInfo: {field:'price', direction:'ASC'},
            reader: new Ext.data.ArrayReader({
                  fields: [
                  {name: '序号'},
                  {name: '采购单号'},
                   {name: '供应商代码'},
                   {name: '供应商名称'},
                   {name: '订单日期'},
                   {name: '金额'},
                   {name: '付款方式'},
                   {name: '制单人'},
                   {name: 'id'},
                   {name: '是否生效'}
                ]
            })
        });
        // create the Grid
        var grid = new Ext.grid.GridPanel({
            store: store,
            columns: [
                {id:'序号',header: "序号",  width: 20, sortable: true, dataIndex: '序号'},
                {header: "采购单号", width: 125 , sortable: true, dataIndex: '采购单号'},
                {header: "供应商代码", width: 125, sortable: true, dataIndex: '供应商代码'},
                {header: "供应商名称", width: 75, sortable: true, dataIndex: '供应商名称'},
                {header: "订单日期", width: 75, sortable: true, dataIndex: '订单日期'},
                {header: "金额", width: 65, sortable: true, dataIndex: '金额'},
               {header: "付款方式", width: 85, sortable: true,  dataIndex: '付款方式'},
                {header: "制单人", width: 85, sortable: true,  dataIndex: '制单人'},
                 {header: "id",hidden:true, width: 105, sortable: true, dataIndex: 'id'},
               {header: "是否生效", width: 85, sortable: true,  dataIndex: '是否生效'}
              
            ],
                   stripeRows: true,
            autoExpandColumn: '序号',
            height:Ext.get("grid-example").getHeight(),
            width:Ext.get("grid-example").getWidth(),
            frame:true,
            title:'采购单信息',
            
            viewConfig: 
            { 
              columnsText:'列', 
              sortAscText:'升序', 
              sortDescText:'降序', 
              getRowClass : function(record,rowIndex,rowParams,store){ 
                          if(record.data.是否生效=="不生效"){ 
                           return 'x-grid-record-red'; 
                       }else{ 
                           return ''; 
                       }                    }         },  
            
            
                    plugins: new Ext.ux.PanelResizer({
                minHeight: 100
            }),        bbar: new Ext.PagingToolbar({
                pageSize: 24,
                store: store,
                displayInfo: true,            plugins: new Ext.ux.ProgressBarPager()
            })
        });
        grid.render('grid-example');
       function rowdblclickFn(grid, rowIndex, e){//双击事件   
                 var row = grid.store.getById(grid.store.data.items[rowIndex].id);   
              
                          var url; //转向网页的地址;
    var name; //网页名称,可为空;
    var iWidth=900; //弹出窗口的宽度;
    var iHeight=668; //弹出窗口的高度;
    var iTop = (window.screen.availHeight-30-iHeight)/2; //获得窗口的垂直位置;
    var iLeft = (window.screen.availWidth-10-iWidth)/2; //获得窗口的水平位置;
               //  window.open("/erp/buy/queryonestock?id='"+row.get("id")+"'","re",'height='+iHeight+',,innerHeight='+iHeight+',width='+iWidth+',innerWidth='+iWidth+',top='+iTop+',left='+iLeft+',toolbar=no,menubar=no,scrollbars=yes,resizeable=no,location=no,status=no');
                 window.location.href="/erp/buy/queryonestock?id='"+row.get("id")+"'";
            }  
             grid.addListener('rowdblclick', rowdblclickFn);   

        store.load({params:{start:0, limit:25}});
    });
        
        
        
        
        





    </script>这样用GridPanel分。
      

  12.   

    Query query = session.createQuery(" from Cangku c , Materiel m where c.materielid = m.id");
    List<Object[]> list = query.list();
    for(Object[] objs : list){
    for(Object obj : objs){
    if(obj instanceof Cangku ){
    Cangku simp = (Cangku )obj;
    System.out.println(simp.getName());
    }
    if(obj instanceof Materiel ){
    Materiel us = (Materiel )obj;
    System.out.println(us.getAge());
    }
    }
    }