2012-12-20 2 views
1

우선 시나리오에 대해 간단히 설명해 드리겠습니다. 데이터베이스는 Sybase입니다. 몇 가지 2-3k 저장 프로 시저가 있습니다. 저장 프로시 저는 거대한 데이터 (약 백만 건의 레코드)를 반환 할 수 있습니다. 필요한 프로 시저를 호출하고 xml 형식으로 클라이언트에 다시 데이터를 플러시하는 서비스 (servlet/spring controller)가 있습니다.자바에서 거대한 데이터 필터링/정렬

필터링 (여러 개의 열 & 여러 조건)/정렬 (일부 동적 조건에 따라) 필터링이 필요합니다.

데이터가 거대하기 때문에 모든 필터링/정렬 메모리를 수행하는 것이 좋지 않습니다. 나는 아래 옵션들을 생각 해왔다.

옵션 1 : 일단 ResultSet 객체를 얻으면 일부 X 번호를 읽습니다. 레코드를 필터링하고, 일부 파일에 저장하고, 모든 데이터가 읽힐 때까지이 프로세스를 반복하십시오. 그런 다음 파일을 읽고 클라이언트로 데이터를 플러시하십시오.

필터링/정렬이 빠르도록 파일의 데이터를 정렬하고 파일에 개체를 저장하는 방법을 알아야합니다.

옵션 2 : 데이터를 가져와 일부 자바 API에 대한 이봐, 그것을이 주어진 기준에 따라 & 종류의 필터와 스트림

옵션 3으로 다시 반환 사용에 hsqldb, h2database와 같은 메모리 데이터베이스 - 그러나 이것은 도움이 아니라 오버 헤드가 될 것이라고 생각합니다. 데이터를 먼저 삽입 한 다음 데이터를 쿼리해야하는데이 작업도 파일 시스템을 사용합니다.

참고 저장 프로 시저를 수정하지 않으므로 데이터베이스에서 필터링/정렬 옵션을 사용할 수 없거나 옵션이없는 경우 마지막 옵션이 될 수 있습니다.

또한 도움이된다면 ResultSet에서 읽은 모든 레코드를 키 이름으로 키에 저장하고이 맵은 필터링 & 정렬을 적용한 List에 저장됩니다.

메모리 풋 프린트, 확장 가능, 성능 현명한 또는이 시나리오에 적합한 다른 옵션에는 어떤 옵션이 좋을 것이라고 생각하십니까?

감사합니다.

+1

저장 프로 시저를 수정하거나 새로 추가하여 임시 테이블에 결과를 저장 한 다음 임시 테이블의 하위 목록을 반환하십시오. – artbristol

+1

이 필터링 및 정렬과 같은 소리는 데이터베이스의 책임입니다. 데이터를 전송하기 전에 왜 그렇게하지 않습니까? 결국 데이터베이스가 좋은 것입니다. 우리 나라에서 말한 것처럼 : 당신이 삶은 물을 다시 발명하려고 노력하는 것 같습니다. –

답변

2

옵션 3을 권장하지만 메모리 내장 데이터베이스 일 필요는 없습니다. 대신 적절한 데이터베이스를 사용할 수 있습니다. 다른 옵션은 거대한 양의 데이터를 정렬하는 일반적인 문제에 대한보다 구체적인 해결책 일 수 있습니다. 결국, 데이터베이스가 무엇인지에 대한 것이고 그것은 매우 잘합니다.

실제로 옵션 3이 좋은 해결책이 아니라면 정렬/병합 솔루션을 구현할 수 있습니다. Map을 수집하십시오. 그러나 레코드 한도 (예 : 10,000)에 도달 할 때마다 정렬하여 디스크에 쓰고 메모리에서 지우십시오.

데이터가 완성되면 작성한 모든 파일을 열고 병합 할 수 있습니다.

+0

안녕하세요 당신이 준 옵션은 옵션 1입니다 :) 옵션 1의 경우 아무런 문제가 보이지 않습니다. –

+0

예, 그렇습니다. 그러나 각 배치를 별도의 파일에 저장하고 끝에 모두를 한 번에 읽으십시오 . 각 일괄 처리는 이미 정렬되어 있으므로 병합 만하면됩니다. – OldCurmudgeon

1

귀하의 문제에 해당하는가요?

데이터 자체를 필터링해야합니다. 다른 모든 프로 시저를 실행하거나 데이터를 결합하거나 필터링하는 집계 프로 시저를 작성할 수 있지만 가장 좋은 옵션은 2 ~ 3 천 개의 저장 프로 시저를 수정하여 필요한 데이터 만 반환하도록하는 것입니다.

+0

체크 아웃 집계 절차가 도움이되는지 확인하겠습니다. 수정 절차와 관련하여 저장 프로 시저는 복잡하며 필터링 기준은 프런트 엔드에서 사용자가 구성합니다. 저장 프로 시저를 수정하는 것은 필터링 쿼리를 전달해야하고 기존 SQL을 문자열로 형성하고 전달 된 조건 문자열과 연결하여 실행해야하기 때문에 많은 변화가 일어날 것입니다. –

+0

귀하의 질문 아래에 언급 된 바와 같이 : 임시 테이블을 사용하여 결과를 저장하고 필터링 할 수 있습니다. –

+0

데이터베이스는 Sybase입니다. 예 집계 프로 시저/임시 테이블을 살펴 보겠습니다. –

관련 문제