2014-11-24 46 views
0

我通过我查询使用Hibernate的一个表的表时,你得到错误内存不足错误在Hibernate查询大数据

"Exception in thread 
"Thread-4" java.lang.OutOfMemoryError: Java heap space at 
    java.util.Arrays.copyOf(Arrays.java:3222) at 
    java.util.Arrays.copyOf(Arrays.java:3222)". 

这里是我的示例代码。

public List<MyBean> loadData() { 
    Session s=CFactory.getSession(); 
    s.beginTransaction(); 
    List<MyBean> mybean=null; 
    try { 
     Query sry=s.createQuery("from MyBean where flag='NP'"); 
     mybean=sry.list(); 
    s.getTransaction().commit(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return mybean; 
} 

我的问题是如何能在具有庞大的数据表查询并将其转换为一个列表,而在休眠越来越内存不足的错误?

Exception in thread "Thread-4" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:3222) 
    at java.util.Arrays.copyOf(Arrays.java:3222) 
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) 
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) 
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140) 
    at org.hibernate.type.descriptor.java.DataHelper.extractBytes(DataHelper.java:170) 
    at org.hibernate.type.descriptor.java.DataHelper.extractBytes(DataHelper.java:170) 
    at org.hibernate.type.descriptor.java.PrimitiveByteArrayTypeDescriptor.wrap(PrimitiveByteArrayTypeDescriptor.java:124) 
    at org.hibernate.type.descriptor.java.PrimitiveByteArrayTypeDescriptor.wrap(PrimitiveByteArrayTypeDesciptor.java:41) 
    at org.hibernate.type.descriptor.sql.BlobTypeDescriptor$5.doExtract(BlobTypeDescriptor.java:115) 
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:254) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:250) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:230) 
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:331) 
+0

首先你为什么要使用事务,而你只从数据库中读取记录???也可以发布完整的堆栈跟踪? – 2014-11-24 06:47:16

+0

增加你的堆内存。 -Xms和-Xmx是你需要的! – hemanth 2014-11-24 06:49:17

+0

@hemanth这可能与休眠记录功能有关。所以你不能确定这一点。检查这个http://stackoverflow.com/questions/8487221/hibernate-java-lang-outofmemoryerror-java-heap-space – 2014-11-24 06:51:07

回答

2

我认为你不应该一次加载一个大表到内存中,使用分页是必须的。

+0

我如何实现在休眠 – MorganM 2014-11-24 07:18:36

2

您可以使用

Query sry=s.createQuery("from MyBean where flag='NP'") 
.setFirstResult(start).setMaxResults(pageSize); 

的分页。

或者你可以increase heap size

+0

然后如何将分页结果合并到一个bean中? – MorganM 2014-11-24 08:31:55

+0

如果您只是为了dislpay目的而读取数据,那么您可以使用thsi – xrcwrn 2014-11-24 08:59:22

+0

我可以使用什么? – MorganM 2014-11-24 12:06:21