2013-04-22 29 views
-1

我正在使用JSF 2.1,並且在加載包含大量數據的列表時出現問題。 數據經由JPA,基本上看起來這是從一個數據庫中獲取: (只是相關的部分,省略getter和setter)在JPA中加載列表時出現Stackoverflow錯誤

public class HostController { 

    private List<Host> allHosts; 
    @Inject 
    private HostService hostService; 

    public void beforeRenderLoadList(final ComponentSystemEvent event) { 
     allHosts = hostService.findAll(); 
    } 
} 

該代碼在XHTML頁上的metaevent preRenderView使用。

它工作的數據量較小,但由於原始表包含大約6500個條目,因此會引發堆棧溢出錯誤。

有什麼辦法可以延遲加載此列表或解決錯誤?

+0

Google使用分頁解決了它。你考慮過了嗎?世界上哪個人不需要過濾(通過搜索關鍵字)和/或分頁(這樣只有一個子集可以從數據庫中檢索到)就需要一次看到6500個條目?另外一個好處是,檢索和顯示只有10條記錄而不是6500的速度要快得多。順便說一句,這個問題與JSF無關,當使用另一個前端使用JPA時,你會遇到完全相同的問題碼。要獲得更好的答案,請發佈堆棧溢出錯誤和實際的JPA代碼。 – BalusC 2013-04-22 11:23:21

+0

@BalusC查詢基本上是「SELECT h FROM hosts h」。我的數據表工作與分頁和懶加載 - 工作正常。 我在這裏討論的內容應該顯示在selectOneMenu中。有沒有辦法延遲加載一個? – 2013-04-22 11:34:52

+1

包含堆棧 – James 2013-04-22 12:52:04

回答

0

感謝您的回答!

問題最終通過將每個實體的FetchType設置爲LAZY來解決!

0

你可以嘗試增加Java堆空間:

java -Xmx(yourdesiredmemoryspace) yourprogram 
+0

我試過了,但沒有奏效。 該錯誤似乎是由持久性api引起的。 – 2013-04-22 10:33:12

+0

準確地測試了什麼值,並且當您說初始查詢有6500個實體時,您不會提到映射的外觀。除非每個關係都是懶惰的,否則可能會引入整個數據庫,而沒有足夠的內存。嘗試顯示-Xmx,-Xms和-Xss設置並增加它們直到它工作,並且可能返回對象模型。 – Chris 2013-04-22 13:01:44

0

我們通常做在這種情況下是提供數據的分頁。很明顯,實際上這種情況必須在數據量和/或用戶負載較高時解決

這基本上意味着,你將不得不將接受fromto,或size參數佔的記錄數的方法從數據庫中獲取:

public List<Host> getHosts(int from, int to) { 
    hostService.findAllIn(int from, int to); 
} 

例如,Query#setFirstResultQuery classQuery#setMaxResults可以用於在您的服務中實現該功能。

在視圖中的分頁可以通過經由POST <h:commandButton> S或<h:link>秒和GET <f:param>/<f:viewParam>任一處理。粗糙的例子:

<h:commandButton value="Next" action="#{bean.next}"/> 

以期範圍的bean

private int from; 
private int to; 
private int step; 
private int page; 
public String next() { 
    page++; 
    from = (page - 1) * step + 1; 
    to = page * step; 
    return null; 
} 

<h:link value="Next" outcome="viewhost"> 
    <f:param name="page" value="#{bean.page + 1}" /> 
</h:link> 

請注意,增加內存大小是不是解決問題的辦法,但實質上其後果延遲。

或者,您可以使用一些組件庫,例如具有默認分頁功能的Primefaces,如<p:dataTable>

相關問題