나는 다중 계층 데이터베이스 구동 웹 응용 프로그램 (SQL 관계형 데이터베이스, 중간 서비스 계층을위한 Java, UI 용 웹)을 디자인하고 있습니다. 언어는 별 문제가되지 않습니다.데이터베이스에서 거대한 결과 집합을 처리하는 방법
중간 서비스 계층은 데이터베이스의 실제 쿼리를 수행합니다. UI는 단순히 특정 데이터를 요청하고 데이터베이스에 의해 지원된다는 개념이 없습니다.
큰 데이터 세트는 어떻게 처리해야합니까? UI가 데이터를 요청하지만 결과가 너무 커서 메모리에 적합하지 않을 수 있습니다.
이StreetSign getStreetSign(int identifier)
Collection<StreetSign> getStreetSigns(Street street)
Collection<StreetSign> getStreetSigns(LatLonBox box)
UI 계층은 몇 가지 기준을 충족하는 모든 도로 표지판을 얻기 위해 요구 : 예를 들어, 거리 표지판 응용 프로그램의 서비스 계층이있을 수 있습니다. 기준에 따라 결과 세트가 커질 수 있습니다. UI 레이어는 결과를 별도의 페이지 (브라우저의 경우)로 나눌 수도 있고 모두 제시 할 수도 있습니다 (Goolge 지구까지 제공). 잠재적으로 큰 결과 집합은 성능 및 자원 문제 (메모리 부족) 일 수 있습니다.
한 가지 해결책은 완전히로드 된 객체 (StreetSign 객체)를 반환하지 않는 것입니다. 오히려 각 개별 객체를 느리게로드하는 일종의 결과 세트 또는 반복자를 반환하십시오. 난
getStreetSigns(box, 1, 1000000000)
: 물론
Collection<StreetSign> getStreetSigns(LatLonBox box, int pageNumber, int resultsPerPage)
는 UI가 여전히 큰 결과 집합을 요청할 수 있습니다
또 다른 해결책은 요청 된 데이터의 하위 집합을 반환하는 서비스 API를 변경하는 것입니다 이 시나리오의 표준 산업 디자인 패턴은 무엇입니까?
'Collection getStreetSigns (Street street)'바로 그게 당신 문제입니다. 앱이 DB에 의해 지원된다는 사실을 모를 수도 있지만, 작동하는 컬렉션의 크기를 제어 할 수 있어야합니다. 그래서 그 고유 한 제한이 없다면, 응용 프로그램이 다음 중 하나를 지정하도록 허용해야합니다 :'Collection getStreetSigns (Street street, int maxResults, int firstResult)'. –