2013-04-22 2 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 개의 항목을 볼 필요가 있습니까? (따라서 하위 집합 만 DB에서 검색 할 수 있습니다.) 추가 이점은 6500 대신 10 개의 레코드 만 검색하고 표시하는 것이 훨씬 빠릅니다.이 문제는 JSF와는 아무런 관련이 없습니다. JPA를 사용하기 위해 다른 프론트 엔드를 사용할 때와 똑같은 문제가있었습니다. 암호. 더 나은 답변을 얻으려면 스택 오버플로 오류와 실제 JPA 코드를 게시하십시오. – BalusC

+0

@BalusC 쿼리는 기본적으로 "SELECT h FROM hosts h"입니다. 내 데이터 테이블은 페이지 매김 및 지연로드와 함께 작동합니다. 여기서 말하는 내용은 selectOneMenu에 표시되어야합니다. 거기에 게으른로드 할 수있는 방법이 있습니까? –

+1

스택을 포함하십시오. – James

답변

0

답변 해 주셔서 감사합니다.

문제는 결국 각 엔티티의 FetchType을 LAZY로 설정하여 해결되었습니다!

0

당신은 자바 힙 공간을 늘려보십시오 수 : 이러한 상황에서

우리가 평소 무엇
java -Xmx(yourdesiredmemoryspace) yourprogram 
+0

시도했지만 작동하지 않았습니다. 오류가 지속성 API로 인해 발생한 것 같습니다. –

+0

정확히 어떤 값을 시도했는지, 그리고 초기 쿼리에 6500+ 엔티티가 있다고 말하는 동안 매핑이 어떻게 생겼는지 언급하지 않습니다. 모든 관계가 게을리지 않는 한, 전체 데이터베이스를 가져올 수 있으며 메모리가 부족합니다. -Xmx, -Xms 및 -Xss 설정을 표시하고 작동 할 때까지 값을 늘리거나 반환되는 객체 모델을 시도해보십시오. – Chris

0

의 데이터 매김을 위해 제공하고 있습니다. 데이터 볼륨 및/또는 사용자 부하가 높은 경우 실제로 의 상황을 해결해야합니다.

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

, Query#setFirstResultQuery classQuery#setMaxResults :

이것은 기본적으로 데이터베이스에서 얻을 수있는 레코드 수 설명하기 위해 fromto, 또는 size 매개 변수를 수락 할 방법이된다는 것을 의미합니다 서비스 내에서 해당 기능을 구현하는 데 사용할 수 있습니다.

관점에서 매김 POST 통해 <h:commandButton> S 또는 S 및 <h:link> GET 통해 <f:param>/<f:viewParam>가 어느 처리 될 수있다. 거친 예 : 전망

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

메모리 크기를 증가하는 문제에 대한 해결책하지만, 본질적으로 그 결과의 지연 아니라고 콩에게

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> 

참고 범위 .

또는 <p:dataTable>과 같은 기본 페이징 기능이있는 Primeface와 같은 일부 구성 요소 라이브러리를 사용할 수 있습니다.

관련 문제