2009-06-29 4 views
2

현재 OFBiz 기반 ERP의 배포에서 다음과 같은 문제가 발생했습니다. 프레임 워크의 일부 코드는 resultSet.last()를 호출하여 결과 집합의 총 행을 확인합니다. Oracle JDBC Driver v11 및 v10을 사용하면 클라이언트 메모리의 모든 행을 캐시하려고 시도하여 힙 공간이 충분하지 않기 때문에 JVM이 손상됩니다.Oracle은 JDBC를 통해 서버 측 스크롤 가능 커서를 지원합니까?

조사한 후에 Oracle JDBC가 서버 대신 클라이언트 측에서 스크롤 가능한 커서를 캐시를 사용하여 구현하는 것으로 보입니다. 완료) (너무 많이 소요되는 문제가 해결되면, DataDirect의 드라이버를 사용하지만 통화가 resultset.last 할 것으로 보인다 따라서 응용 프로그램 서버에서 JDBC를 통해 화면 이동 커서를 implemente 수있는 방법이 거래

를 중단 오라클은 datadirect 드라이버를 의지하지 않고 있습니까?

그리고 주어진 resultSet의 길이를 가장 빨리 알 수있는 방법은 무엇입니까 ?? 사전에

감사 이스마엘

+0

나는 먼저 탄젠트 질문을 할 것이다. 데이터와 결과 집합의 크기가 동시에 필요하거나 행 개수를 찾기 위해 COUNT (*) 형식 쿼리를 수행 할 수 있습니까? 당신은 정말로 많은 수의 행을 필요로합니까, 프로그램이 실제로 필요하지 않을 때 페이지 매김을위한 총 행 수를 얻는 매우 비싼 연산을하는 곳을 너무 많이 보았습니다. – Gandalf

+0

페이지 매김 스키마에서 페이지 수를 결정해야합니다. last의 사용을 피하기 위해 노력하고 있으며, iterator next() 메소드를 사용하여 null을 검사하여 currentIndex를 계산합니다. last() 메서드를 사용하지 않고 페이지 수를 빠르게 알 수 있습니까? 이 문제를 해결하려면 동일한 조건의 COUNT 쿼리를 실행 한 다음 데이터에 대한 쿼리를 수행하는 것입니다. – Ismael

+0

사용자가 페이지 수를 알아야합니까? 사용자가 마지막 페이지로 바로 이동하려는 올바른 사용자 사례가 있습니까? 우리는 일반적으로 한 페이지에 대해 더 많은 항목을 요구합니다. 그런 다음 해당 항목이 존재하면 다음 페이지를 가져 오기위한 "다음"페이지에 대한 링크를 넣습니다. 데이터에 정렬 할 수있는 순서가 있다고 가정합니다. – Gandalf

답변

1

"무엇 지정된 ResultSet의 길이를 알 수있는 가장 빠른 방법입니다" 을 수있는 유일한 방법을 알고 정말하는 것은 그들 모두를 계산하는 것입니다. 전화 번호부에 얼마나 많은 스미스가 있는지 알고 싶습니다. 당신은 그들을 센다. 작은 결과 집합이며 빠르게 도착한 경우 문제가되지 않습니다. EG 전화 번호부에는 많은 Gandalfs가 없으므로 어쨌든 모든 Gandalfs를 가져 오려고합니다.

큰 결과 집합 인 경우 일반적으로 SQL이 잘 설계된 것은 아니지만 예상치를 수행 할 수 있습니다. 클라이언트에서 전체 결과 집합을 캐싱을 방지하기 위해

, 당신은 다음 각 행은 결과 집합의 행의 수와 (이 경우 N)에 여분의 열이있을 것이다

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

을 시도 할 수 있습니다. 그러나 카운트에 도달하는 데 여전히 동일한 시간이 걸리므로 시간 초과 가능성은 여전히 ​​있습니다.

타협은 첫 번째 백 (또는 천) 행을 얻고 그 이상의 페이지 매김에 대해 걱정하지 않습니다.

+0

+1 : 쿼리가 반환 할 행 수를 알고 있으면 좋겠지 만이 정보는 계산되어야하므로 비용이 들게됩니다. 게리의 대답은 아마도 이것을하기위한 가장 비용이 적게 드는 방법 일 것입니다. –

0

제안 된 "해결 방법"은 기본적으로 DB 서버가 수행하는 작업을 두 배로 늘립니다. 먼저 결과의 수를 세는 데 필요한 모든 것을 거쳐야하며 동일한 결과를 반환해야합니다. Gary (분석() (count (*) over -) 분석에서 언급 된 방법이 훨씬 더 좋습니다. 그러나 여기에서도 첫 번째 출력이 클라이언트에 반환되기 전에 전체 결과 집합을 만들어야합니다. 따라서 잠재적으로 큰 출력을 위해 메모리를 소비하는 속도가 느립니다.

내 생각에 가장 좋은 방법은 화면에서 원하는 페이지 만 선택하는 것입니다 (+1하여 다음 페이지가 존재 함을 확인). 행은 21에서 41 사이입니다. 누군가가 필요로하는 (희귀 한) 상황에서 모든 버튼을 셀 수있는 또 다른 버튼 (usecase)이 있습니다.