我getHibernateTemplate().find("from test")单表有8万多条数据,程序走不动或提示:
java.lang.reflect.InvocationTargetException
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
....
Caused by:Java.lang.outofMemoryError:java heap space我试着读前100条from test rownum<100是没有问题的,数据越大越慢,请高手帮忙看一下:
List list=getHibernateTemplate().find("from test");
if(list != null)(
    for(int i=0;i<list.size();i++){
         Test t=(Test)list.get(i);
         System.out.println(t.getId());
    }
)

解决方案 »

  1.   

    怎样分配读取呀?能提供点思路吗?如果加大内存,读取速度也慢!
    我用的是hibernate自带的分页
      

  2.   


    @SuppressWarnings("unchecked")
    public class BaseDao extends HibernateDaoSupport{ public Page findByPage(String hql,Page page){

    final int firstResult = (page.getCurrentPage()-1)*page.getPageSize();
    final int pageSize = page.getPageSize();
    final String newhql = hql;

    page.setList((List) getHibernateTemplate().execute(
                new HibernateCallback() {
            public Object doInHibernate(Session session)
                    throws HibernateException {
                Query q =session.createQuery(newhql);
                 q.setFirstResult(firstResult);
                 q.setMaxResults(pageSize);
                 List cats = q.list();
                return cats;
            }
        }));
    page.setTotalSize( findAllCount(hql) );
    return page;
    }

    public int findAllCount(String hql){
    return null==getHibernateTemplate().find(hql)?0:getHibernateTemplate().find(hql).size();
    }
    }
      

  3.   

    先查下总条数,然后可以每1000条就保存下,并清下session中缓存
      

  4.   

    每次设置只查一部分啊,别一次全查询出来,setMaxResults 设置每次查询的最大记录数
      

  5.   

    问题解决public int findAllCount(String hql){
            return null==getHibernateTemplate().find(hql)?0:getHibernateTemplate().find(hql).size();
        }
    在这查询时,find.size是从list中获取大小,在这一步就卡死了。把hql改成select count(*)就OK了