문제

DisplayTag를 사용하여 DB의 데이터가 포함 된 테이블을 작성하고 있습니다. 요청 된 목록이 크지 않지만 목록 크기가 2500 개가 넘는 항목이 커지면 결과 목록을 가져 오는 데 5 분 이상이 걸립니다. 이 행동이 정상인지 궁금합니다.

큰 결과를 반환하는 큰 목록 / 쿼리를 어떻게 처리합니까?

도움이 되었습니까?

해결책

이 기사 문제 해결 방법에 대한 예제 앱에 대한 링크. DisplayTag는 페이징 링크를 만들고 정렬을 처리하기 위해 전체 데이터 세트가 전달 될 것으로 기대합니다. 이런 종류의 데이터는 데이터에 외부로 페이징을하고 (사용자 페이지로) 요청 된 행만 가져 오는 아이디어를 깨뜨립니다. 이 기사에 연결된 프로젝트는 이러한 유형의 물건을 설정하는 방법에 대해 설명합니다.

대형 데이터베이스로 작업하는 경우 쿼리를 실행하는 데 문제가있을 수도 있습니다. 나는 당신이 이것을 배제했다고 생각합니다. 그렇지 않은 경우 앞에서 언급했듯이 SQL이 있습니다. DB2 쿼리 분석기를 통해 실행하여 DB 병목 현상이 있는지 확인합니다. 다음 단계로 체인은 믹스에 디스플레이 테그없이 단위 테스트에서 최대 절전 모드/DAO 호출 테스트를 실행하는 것입니다. 다시 말하지만, 당신이 말한 방식에서, 당신이 이미 이것을 한 것처럼 들립니다.

다른 팁

DisplayTag는 모든 것을 메모리에 저장하고 (세션) 모든 것을 저장합니다. 최대 절전 모드도 그렇게합니다. 메모리에 전체 DB 테이블 내용을 한 번에 사용하고 싶지는 않습니다 (그러나 속도가 이미 2500 행에서 시작되면 심하게 최적화 된 SQL 쿼리 / DB 테이블의 문제처럼 보입니다. 2500 행은 Peanuts가되어야합니다. 괜찮은 DB이지만 좋아, 또 다른 이야기입니다).

오히려 도움이 거의없이 HTML 테이블을 직접 만듭니다. JSTL c:forEach 그리고 샷 엘자. 하나 또는 두 개의 요청 매개 변수를 백그라운드에서 유지하십시오. input type="hidden": 표시되는 첫 번째 행 (firstrow) 그리고 결국 한 번에 표시 될 행의 양 (rowcount).

그런 다음 DAO 수업에서 그냥 a SELECT stuff FROM data LIMIT firstrow OFFSET rowcount 또는 사용 된 DB에 따라 그런 것. MySQL 및 PostgreSQL에서는 사용할 수 있습니다 LIMIT 및/또는 OFFSET 그런 조항. 오라클에서는 하위 쿼리를 발사해야합니다. MSSQL 및 DB2에서는 sp를 만들어야합니다. HQL로 할 수 있습니다.

그런 다음 테이블을 통해 페이지로, 서버 사이드 코드가 firstrow ~와 함께 rowcount 매번. 그냥 수학을하십시오.

편집하다: 당신은 당신이 DB2를 사용하고 있다고 언급했습니다. 약간의 연구를 수행했는데 UDB OLAP 기능을 사용할 수있는 것으로 보입니다. ROW_NUMBER() 이것을 위해 :

SELECT id, colA, colB, colC 
    FROM (
        SELECT 
            ROW_NUMBER() OVER (ORDER BY id) AS row, id, colA, colB, colC
        FROM
            data
        ) AS temp_data
    WHERE
        row BETWEEN 1 AND 10;

이 예제는 처음 10 행을 반환해야합니다. data 테이블. 모든 페이지에 대해 재사용 할 수 있도록이 쿼리를 매개 변수화 할 수 있습니다. 이것은 Java의 메모리에서 전체 테이블을 쿼리하는 것보다 더 효율적입니다. 또한 테이블이 올바르게 색인되어 있는지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top