2014-11-24 45 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