2011-04-01 57 views
1

我使用下面的一段代码来从数据库中获取结果,因为结果集很大。休眠 - Java分页 - 内存不足异常

这是正确的做法吗? 我正在运行内存异常,我怀疑这是因为这个。

// div is set to 10,000 
// i have calculated how many times i need do it using a count query 
// and that value is being used in iteration variable 

Query bigQ=session.createSQLQuery(bigQuery); 

for(int i=0;i<iteration;i++)  
{ 
    bigQ.setFetchSize(div);       
    bigQ.setMaxResults(i*div); 

    List<Object[]> result=bigQ.list(); 

    // now i am using the result to get the values 
    for(Object[] a:result) 
    { 
     // rest of operations 
    } 
} 

注:

  1. 我在jboss run.conf设置足够-Xms和-Xmx。
  2. 我不能使用可滚动设置,因为postgre驱动程序不支持它。
  3. 我不能使用createQuery,因为在这种情况下,hibernate正在生成很多查询,所以我使用了一个大连接查询以及createSQLQuery

回答

2

您的代码看起来很奇怪 - 进行分页结果会是这样的正确方法是:

bigQ.setFirstResult(i * div); 
bigQ.setMaxResults(div); 

另外,还要确保您的会话缓存中不增长 - 如果你的查询只返回标量值(不是实体),它不应该是一个问题,但如果你加载一些实体在// rest of operations,它可以。

+0

谢谢你的回复..如何确保会话缓存不会增长? – lam 2011-04-07 05:38:33

+0

再次感谢您提供清除会话缓存的提示。使用session.evict()后,我能够从内存不足错误中恢复 – lam 2011-04-08 05:31:44