문제

현재 Ofbiz 기반 ERP의 배포에서 작업하면서 다음과 같은 문제가 발생했습니다. 프레임 워크의 일부 코드는 resultset.last ()를 호출하여 결과 세트의 총 행을 알 수 있습니다. Oracle JDBC 드라이버 V11 및 V10을 사용하여 클라이언트 메모리의 모든 행을 캐시하려고 시도하여 힙 공간이 충분하지 않기 때문에 JVM에 충돌합니다.

연구 후, 문제는 Oracle JDBC가 캐시를 사용하여 서버 대신 클라이언트 측에서 스크롤 가능한 커서를 구현하는 것 같습니다. DataDirect 드라이버를 사용하면 해당 문제가 해결되지만 resultSet.last ()에 대한 호출이 완료하는 데 너무 많은 시간이 걸리므로 응용 프로그램 서버가 트랜잭션을 중단합니다.

DataDirect 드라이버에 의지하지 않고 Oracle의 JDBC를 통해 스크롤 가능한 커서를 구현할 수있는 방법이 있습니까?

그리고 주어진 결과 세트의 길이를 아는 가장 빠른 방법은 무엇입니까 ??

미리 Ismael에게 감사합니다

도움이 되었습니까?

해결책

"주어진 결과 세트의 길이를 아는 가장 빠른 방법은 무엇입니까?"실제로 아는 유일한 방법은 그들 모두를 세는 것입니다. 전화 번호부에 얼마나 많은 'Smith's가 있는지 알고 싶습니다. 당신은 그들을 세고 있습니다. 작은 결과 세트이고 빠르게 도착하면 문제가되지 않습니다. 예를 들어 전화 번호부에는 간달프가 많지 않을 것입니다.

큰 결과 세트 인 경우 추정을 수행 할 수는 있지만 일반적으로 SQL이 잘 설계된 것은 아닙니다.

클라이언트의 전체 결과 세트를 캐싱하지 않으려면 시도 할 수 있습니다.

select id, count(1) over () n from junk;

그러면 각 행에는 결과 세트에서 행 카운트가있는 추가 열 (이 경우 n)이 있습니다. 그러나 카운트에 도달하는 데 여전히 같은 시간이 걸리므로 여전히 타임 아웃 가능성이 높습니다.

타협은 첫 백 (또는 천 개) 행을 얻는 것이며, 그 이상의 페이지 매김에 대해 걱정하지 마십시오.

다른 팁

카운트가있는 제안 된 "해결 방법"은 기본적으로 DB 서버에서 수행 한 작업을 두 배로 늘립니다. 먼저 결과 수를 세고 동일한 + 반환 결과를 수행하기 위해 모든 것을 걸어야합니다. 게리 (count (*) over () - 분석)가 언급 한 방법이 훨씬 낫습니다. 그러나 여기서도 첫 출력이 클라이언트에게 반환되기 전에 전체 결과 세트를 작성해야합니다. 따라서 큰 출력에 대한 메모리 소비가 느려질 수 있습니다.

내 생각에 가장 좋은 방법은 화면에서 원하는 페이지 만 선택하는 것입니다 (다음이 존재하는지 확인하려면 +1) 예를 들어 21에서 41까지 행을 선택하고 다른 버튼 (usecase)이 있습니다. 필요합니다.

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