2009-06-02 5 views
1

많은 양의 데이터를 얻기 위해 JDBC를 사용하고 있습니다. 호출이 성공적으로 완료되지만 resultSet.next()가 호출 될 때, 나는 다음과 같은 오류 얻을 : 나는 JVM 메모리 크기를 증가하려고 시도했습니다Out of Memory 결과 집합의 allocLargeObjectOrArray

java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 15414016, Num elements: 7706998 

을하지만,이 문제가 해결되지 않습니다. JDBC를 사용하여 데이터베이스에 액세스하지 않고 시스템이 JDBC를 통해 BEA AquaLogic 서비스에 액세스 할 때이 문제를 해결할 수 있는지 확신 할 수 없습니다.

누구든지이 오류가 발생 했습니까?

+0

더 완벽한 스택 추적을 게시 할 수 있습니까? – Gandalf

+0

데이터베이스에서 무엇을 읽으려고하십니까? –

답변

1

첫 번째 resultSet.next() 호출까지 결과가 아직 데이터베이스에서 읽히지 않았거나 어딘가에 다른 캐싱 구조에 남아있을 수 있습니다.

선택을 제한하여 정상적인 결과를 반환하고 모든 데이터가 필요하면 결과가 남아 있지 않을 때까지 통화를 반복하십시오.

JVM 메모리 크기를 늘리면 JDBC 호출에 의해 반환되는 데이터 양에 절대적인 제한이 있음을 확신 할 수없는 한 도움이되지 않습니다.

또한, JDBC를 통해 어떤 서비스에 액세스하는 것은 기본적으로 사용하고있는 JDBC 드라이버의 버그가 있다고 할 수 JDBC :

또 다른 (가능성) 가능성을 사용하여 요약된다. 가능한 경우 다른 구현을 시도하고 문제가 지속되는지 확인하십시오.

+0

나는 JDBC 드라이버가 범인이라는 것을 의심하지 않을 것이다. 그러나 BEA 고유의 다른 구현을 시도 할 수는 없습니다. 내가 찾는 정보를 얻는 데는 다른 방법이 있지만 현재로서는 큰 도움이 될 것입니다. – Nick

+1

나는이 문제를 파악할 시간이 없었다. 그동안 데이터를 오류없이 반환 할 수있는 것 같습니다. 어쨌든 제 사건이 최악의 경우라고 생각합니다. 가장 견고하기 때문에이 대답을 수락하십시오. – Nick

0

문에 setFetchSize (int 행) 메서드를 설정할 수 있습니다.
하지만 setFetchRows는 힌트 일 뿐이며 구현되지 않을 수도 있습니다.

+1

하나의 행만 반환되므로이 기능은 작동하지 않습니다. – Nick

0

예를 들어 메모리 크기를 1.2g으로 늘리십시오. -mx1200m 또는 귀하의 컴퓨터의 실제 메모리보다 약간 작은 것. 한 번에 생각보다 많은 데이터를 읽는 것을 알 수 있습니다.

+1

너무 많은 메모리를 지정했기 때문에 JVM이 응용 프로그램을 시작하지 않을 정도로 메모리를 늘 렸습니다. 내 기계가 가장 힘들지도 않다. – Nick

1

첫 번째로, 많은 양의 데이터를 메모리에서 한꺼번에 가져와야하는지 먼저 확인하십시오. RDBMS는 대규모 데이터 세트를 집계/정렬하는 데 능숙하며 가능한 경우이를 활용하려고 노력해야합니다.

그렇지 않으면 (실제로 어떤 이유로 작업 메모리에서 많은 양의 데이터가 필요합니다) ... 그리고 JVM의 메모리 인수를 높이면 바를 충분히 올릴 수 없습니다 ... 메모리를 조사하십시오 Coherence (COTS) 또는 TerraCotta (오픈 소스)와 같은 분산 캐싱 솔루션

0

데이터베이스에서 몇 행을 반환합니까? kosi2801처럼 데이터의 하위 집합을 가져오고 적당한 수로 시작한 다음 임계 값을 찾기 위해 늘리십시오.