2010-01-03 2 views
4

나는 페이지에서 10 항목으로 말할 수있는 부분적으로 웹 페이지에 결과 집합을 표시하려면 성능 관점에서 최상의 aproach를 찾고, 사용자가 더 많은 결과를보고 싶다면, 그는 "다음"btn. "(다음 번에"버튼을 누를 때 서버에 대한 새로운 요청이 있어야한다고 생각합니다.) 가장 큰 방법은 페이징 큰 Resultset -Java

는 currentlly 난 자바, GWT

감사를 배우려고 노력!

추신 : 내 영어로 죄송합니다.

답변

3

사용자의 행동에 달려 대답 : 얼마나 자주 것 2 페이지 또는 10 페이지 또는 페이지의 모양 (100)

가 거의 10 페이지를 보면 2 페이지에서 봐, 결코 경우 또는 페이지 100, 요청을 다시 제출하는 것이 좋습니다.

페이지 2를 자주보고 자주 10 페이지를 살펴본 다음 100 페이지를 자주 보는 경우 부분 캐시가 유용합니다. 첫 번째 100 개 (또는 200 개 또는 300 개)의 결과를 캐싱하고 그들이 그 결과를 지나칠 때 질의. 응용 프로그램 서버가 클러스터 된 경우 몇 가지 생각을해야하지만 사용자 세션에 캐시를 저장하는 것이 좋습니다.

그리고 항상 모든 결과를 페이징하면됩니까? 메모리의 큰 덩어리를 메모리에 저장하고 싶지 않기 때문에 부분 캐시는 여전히 답을 찾을 수 있습니다.

0

일반적으로 데이터베이스에서 "페이지"만 가져옵니다.

는의 1000 개 기록을 줄 것이다 쿼리를

select * from mytable where column1="a"; 

을 가정 해 봅시다. (10-0) 페이지 1

select * from mytable where column1="a" limit 0, 10; 

, 페이지 2처럼 검색 할 것입니다 : : 다음 페이지를 얻는 것은 (MySQL의) 같은 것 등

select * from mytable where column1="a" limit 10, 20; 

합니다. 데이터가 크고 (1000 레코드), 거대한 것은 아니지만 (1000 000 레코드), 전체 데이터 세트를 한 번에주고 자바 스크립트를 사용하여 페이지를 만들 수 있습니다. 클라이언트 측에서 정렬 작업을 수행 할 수 있다는 장점이 있습니다.

+1

LIMIT를 SQL의 모든 언어에서 사용할 수있는 것은 아니며 쿼리 구조에 따라 매우 비효율적 일 수 있습니다 - 엔진은 전체 쿼리를 실행 한 다음 제한을 적용해야합니다 (MySQL에는 최적화가 있지만). – kdgregory

+0

MySQL을 적당한 크기의 쿼리 캐시와 함께 사용하면 비용이 많이 들지 않으며 많은 수의 클라이언트를 상당히 잘 처리합니다 (캐시가 가득 차면 CPU를 희생합니다). 주어진 정보를 기반으로 나는 많은 결함 허용 클린업 코드를 필요로하는 별도의 동적으로 생성 된 테이블을 제외하고는 더 나은 것을 전혀 생각할 수 없다. – extraneon

1

태그에 "GWT"가 있으므로 서버 앱이 Google App Engine (GAE)에서 실행되고 있다고 가정합니다.

  • 한 가지 방법은, 당신의 첫 번째 쿼리는 모든 결과를 얻을 가지고 DB에 저장, 처음 20을 표시하고 다음/이전 링크는 DB에서 저장된 데이터의 하위 집합을 풀 수 있도록하는 것입니다. 사용자 세션이 종료되면 DB에서 해당 결과를 삭제해야합니다.

  • 또 다른 방법은 각 페이지 뷰에서 모든 결과를 얻는 것이지만 원하는 하위 집합 인 20 개를 누를 때까지 결과를 건너 뛰고 그 결과 만 출력합니다.

나는 당신의 쿼리가 GAE 당신이 하나의 트랜잭션 내에서 검색 할 수 없습니다 1000 개 이상의 결과를 반환 할 가능성이 하지 않는 한 아래 GAE로, 제 2 방법은 더 나은 작동합니다 생각합니다.

  • 데이터와 키가 자신에게 적합 할 경우 가장 좋은 방법은 쿼리 시간에 이미 올바른 20 개의 데이터 항목을 꺼내는 것입니다. 그러나 데이터에 연속적으로 오름차순 정수 키가있는 경우가 아니면 수행하기가 어려울 수 있습니다.
+0

+1 애플 리케이션 엔진 의견을 ... 나는 GWT가 단순히 일반 애플 리케이션 서버의 프론트 엔드로 사용되었다고 생각했다. – kdgregory

0

메모리 제한으로 인해 캐시 기반 접근 방식을 사용할 수없는 경우 쿼리 기반 방식을 사용하십시오. 사용자가 요청한 페이지를 기반으로 명시 적으로 데이터를 선택하도록 검색 쿼리의 WHERE 절을 조정하십시오. 이 방법을 사용하려면 페이지 요청시 추가 컨텍스트 정보를 앞뒤로 전달해야합니다.

한 가지 방법은 페이지를 구분하고 결과 집합의 각 행을 식별하는 논리 행 ID (또는 기본 키)를 사용하여 페이지를 가져 오는 것입니다.

행 ID가 숫자로 된 매우 간단한 테이블이 있다고합시다. 당신이 페이지 당 100 개 행을 보여주고, 사용자가 두 번째 페이지를 요청한 경우 다음과 같이 WHERE 절을 조정할 것 :

select col, col2 from my_table where 
row_id > 100 
and row_id <= 200 
order by rownum asc 
0

당신은 캐시 할 수/예를 들어, EJB를위한 웹 층, 백엔드 층 (에서 레코드를 검색) 또는 데이터베이스 계층 (마지막 "제한"또는 row_id 문). 어떤 접근 방법을 사용해야하는지는 kdgregory가 말한 것처럼 요구 사항에 따라 다릅니다.

가장 인기있는 것은 세션을 사용하여 웹 레이어에서 캐시하는 것입니다. 당신이 (GAE에 아주 잘 작동) JPA를 사용하는 경우