2016-08-18 65 views
0

在某些情況下,我需要讀取批處理的數據庫表的所有行。爲了與db溝通我使用DAO。所以在服務層上,我可以做類似dao.getAll()的事情。爲此,我需要從dao返回每行數據庫。如果出現「內存不足錯誤」,我無法返回包含所有實體的List,因爲表格非常大。分頁不是一個好的解決方案,因爲它會導致多個數據庫調用。 所以有一個叫做的東西,它允許我滾動瀏覽所有實體並處理每一行而不會溢出內存。由於我使用DAO,我必須將每行從DAO返回到服務層。我怎樣才能做到這一點?是否有其他解決方案來解決這個問題?我正在使用嵌入式Derby數據庫的Hibernate。Hibernate - 從服務層的DAO獲取ScrollableResults

回答

0

這可以通過查詢接口和標準,以及完成..

Query query = session.createQuery(query); 
query.setReadOnly(true); 
query.setFetchSize(Integer.MIN_VALUE); 
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY); 
// iterate over results 
while (results.next()) { 
    Object row = results.get(); 
    // process row then release reference 
    // you may need to evict() as well 
} 
results.close(); 

這裏Hibernate將仍然緩存結果的會話,所以你需要調用session.evict()或會話。清楚()每隔一段時間。

當不需要緩存時,最好使用StatelessSession。

ScrollableResults results = session.createQuery(query) .setReadOnly(true).setFetchSize(1000).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY) 
+0

好吧,但這樣做,我會在處理結果時在我的DAO中擁有業務邏輯。這就是我想要避免的。我以爲我可以在DAO之外得到結果,並在另一個課程中處理它們。那可能嗎? – Joey