日期:2014-05-20  浏览次数:20712 次

求Hibernate查询问题
后台表很大,有几十万行数据,如果想全部查询时出错:java.lang.OutOfMemoryError: Java heap space代码如下:

Session session=HibernateSessionFactory.getSession();
Query query=session.createQuery("from XXX");
List list=query.list();
System.out.println(list.size());




------解决方案--------------------
楼主的问题是内存泄漏

这个问题的根源是jvm虚拟机的默认Heap大小是64M,可以通过设置其最大和最小值来实现.设置的方法主要是几个.

1.可以在windows 更改系统环境变量

加上JAVA_OPTS=-Xms64m -Xmx512m

2,如果用的tomcat,在windows下,可以在

C:\tomcat5.5.9\bin\catalina.bat 中加上:

set JAVA_OPTS=-Xms64m -Xmx256m

位置在: rem Guess CATALINA_HOME if not defined 这行的下面加合适.

3.如果是linux系统

Linux 在{tomcat_home}/bin/catalina.sh的前面,加 

set JAVA_OPTS='-Xms64 -Xmx512'


------解决方案--------------------
更改服务器的内存是可以实现的
但还是有一定的限制的,如果数据量变大,就不好控制了
所以说不能采取硬件措施,应从软件入手:分页取数据

Session session=HibernateSessionFactory.getSession();
Query query=session.createQuery("from XXX");

query.setMaxResults(pageSize);
query.setFirstResult(startIndex);
int totalRec = totalCount;
//pageInfo是分页类
pageInfo.setTotalRec(totalRec);
if (startIndex == 1)
pageInfo.setPageIndex(1);
int totalPage = (totalRec % pageSize == 0) ? (totalRec / pageSize)
: (totalRec / pageSize) + 1;
pageInfo.setTotalPage(totalPage);
pageInfo.setPageSize(pageSize);
pageInfo.setPageIndex(pageIndex);
pageInfo.setPrePage(pageIndex - 1);
pageInfo.setNextPage(pageIndex + 1);

List list=query.list();
System.out.println(list.size());