2017-08-29 84 views
0

我正在使用hibernate 4.3.10,java 1.8和eclipse neon。 我一直在尝试在我的代码中执行以下语句。但java.lang.OutOfMemoryError:在选择20万行时在休眠时Java堆空间

java.lang.OutOfMemoryError: Java heap space

在几分钟后第二行抛出。

Query query = mySqlSession.createSQLQuery("select * from hops where processed is null"); 
List<Object[]> lis=query.list(); 

问题是此查询返回约200k结果导致问题。我推荐 How to deal with "java.lang.OutOfMemoryError: Java heap space" error (64MB heap size)

从上面的链接阅读解决方案后,我将内存更改为2 GB。仍然存在问题。 有什么建议吗?

+2

是否有可能不将200k记录存入内存? – Pijotrek

+0

请参阅https://stackoverflow.com/questions/33019211/do-query-loads-all-the-data-in-memory – rmlan

+0

必须更改算法以仅使用当前记录(当前:将所有记录存入RAM)。顺便说一句,为什么使用hibertate进行经典查询? –

回答

3

根据你在做什么与ro ws,处理这种情况的正确方法是使用LIMIT一次只检索一部分结果。

然后,您可以循环查询并在行可用时处理结果集。

SELECT * FROM hops WHERE processed IS NULL LIMIT 10000 

使用非本地查询时,请参阅@ Stefano的答案。

1

实际问题是返回这样一个大数据集。即使您增加了进程内存,当更多数据进入商店时,您仍然会遇到此问题。你可能想在这里实现Paging。这是获得有限的一小组数据,然后根据请求获取下一页。

+0

对。我曾经这样想过,但我没有一个领域,可以帮助我选择一个小集合,然后另一个小集合等等 –

+0

这就像挑选一批处理为空的数据。 –

+0

绝对正确。我将只设置一次处理过的空值,但现在它们都是空的。 –

1

我认为有2种方式:

1.Pagination(选择每个查询n只有行)

Criteria c = session.createCriteria(Envelope.class); 
List<Envelope> list = c.setMaxResults(10).list(); 

2.Scrollable结果(类似一个JDBC结果)

Criteria c = session.createCriteria(Envelope.class); 
ScrollableResults scroll = c.scroll(ScrollMode.FORWARD_ONLY); 
while (scroll.next()) { 
    Envelope e = (Envelope) scroll.get(0); 
    // do whatever 
} 

您也可以使用一个StetelessSession

相关问题