2009-12-17 3 views
1

나는 내 DB에서 데이터가있는 테이블을 만들려면 displaytag를 사용하고 있습니다. 요청한 목록이 그다지 크지 않지만 목록 크기가 2500 개가 넘는 경우 결과 목록을 가져 오는 데 5 분 이상이 소요됩니다. 이 행동이 정상적인 지 궁금 해서요.최대 절전 모드 디스플레이 목록 큰 목록

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

+0

정상이 아닙니다. 구성, 설정, 네트워크 컨텍스트 등에 대한 자세한 내용을 알려주십시오. – Bozho

+0

많은 양의 데이터로 DB2 데이터베이스를 쿼리하고 있습니다. 설정은 나의 DAO를 위해 스프링 2.5.6을 사용하는 JSR-168 포틀릿이다. 쿼리가 매우 복잡하며 일부 예외 및 IN (선택 ...)이 포함되어 있습니다. 서버와 DB가 동일한 컴퓨터에 있습니다 – onigunn

+0

SQL 클라이언트에서 쿼리가 수행되는 방식은 무엇입니까? –

답변

1

This article이 문제를 해결하는 방법에 대한 예제 응용 프로그램에 대한 링크입니다. Displaytag는 페이징 링크를 만들고 정렬을 처리하기 위해 전체 데이터 집합을 전달해야합니다. 이런 종류의 것은 데이터 외부의 페이징 아이디어를 깨고 요청 된 행만 가져 오는 것입니다 (사용자 페이지로). 이 기사에서 링크 된 프로젝트는 이런 유형의 것을 설정하는 방법을 설명합니다.

큰 데이터베이스로 작업하는 경우 쿼리를 실행하는 데 문제가있을 수 있습니다. 나는 당신이 이것을 지배했다고 가정합니다. 그렇지 않다면 앞에서 언급 한 바와 같이 SQL이 있습니다. DB 쿼리 분석기를 통해 DB 병목 현상이 있는지 확인합니다. 체인의 다음 단계는 믹스에서 디스플레이 태그없이 유닛 테스트에서 Hibernate/DAO 호출의 테스트를 실행하는 것입니다. 다시 말하지만, 어떻게 말로 표현했는지에 따라, 이미이 작업을 수행 한 것처럼 들립니다.

0

디스플레이 태그는 모든 것을 메모리에 저장합니다 (세션). 최대 절전 모드에서도이를 수행합니다. 한 번에 전체 DB 테이블의 내용을 메모리에 저장하고 싶지는 않습니다 (그러나 2500 회 행에서 속도 저하가 이미 시작된 경우 심하게 최적화 된 SQL 쿼리/DB 테이블과 같이 보이지만 2500 행은 알맞은 DB,하지만 그건 또 다른 이야기입니다).

c:forEach의 도움과 EL의 도움으로 직접 HTML 표를 만들지 마세요. 백그라운드에 하나 또는 두 개의 요청 매개 변수를 input type="hidden" : 첫 번째 행 (firstrow)과 한 번에 표시 할 행의 양 (rowcount)으로 유지하십시오.

그런 다음 DAO 클래스에서 사용되는 DB에 따라 SELECT stuff FROM data LIMIT firstrow OFFSET rowcount 또는 그와 비슷한 것을 수행하십시오. 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; 

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