2010-03-15 2 views
2

안녕하십니까.(outofmemoryerror : java heap space) 오라클 레코드를 반복 할 때

여기에 약간의 문제가 있습니다. 오라클 데이터베이스에서 결과 집합을 가져 와서 파일에 각 행을 인쇄 한 다음 다음 행을 가져 오는 코드가 있습니다. 결과 집합이 끝날 때까지 계속됩니다.

오직 어떤 일이 발생하지 않습니다. 결과는 메모리를 다 써 버릴 때까지 결과 집합을 가져 와서 행 반복을 시작하고 파일로 인쇄하여 Java 힙에 더 많은 공간이 필요하다고 주장합니다.

응용 프로그램은 현재 힙에서 2g의 메모리로 실행 중이며 코드는 약 150000 번째 행에서 중단됩니다. 아래 시도

Connection conn = DriverManager.getConnection(url,"name","pwd"); 

conn.setAutoCommit(false); 
Statement stmt = conn.createStatement(); 
ResultSet rset = stmt.executeQuery(strSql); 

String strVar_1 = null; 

long lCount = 0; 
while(rset.next()){ 
     lCount++; 
     if (lCount % 100000 == 0){ 
      System.out.println(lCount + " rows completed"); 
     } 
     strVar_1 = rset.getString("StringID"); /// breaks here!!!!!!!!! 

     if (strVar_1 == null){ 
     strVar_1 = ""; 
     }   
     if (!strQuery_1.equals("")){ 
     out.write(strVar_1 + "\n"); 
     } 
} 
out.close(); 

답변

4

:

Statement stmt = conn.createStatement(); 
stmt.setFetchSize(someInt); 
ResultSet rset = stmt.executeQuery(strSql); 

이 방법을 제어합니다 내가 jodbc6.jar 및 자바 여기에 6

을 사용하고

내 코드가 무엇을하고 있는지의 생각이다 한 번에 많은 레코드를 가져옵니다.

+0

Ok, 다시 시도하고 네트워크를 통해 레코드를 반환하는 데 시간이 오래 걸립니다.) 감사합니다 – rockit

+0

귀하의 쿼리 꽤 많은 행을 반환했다 생각. 보조 노트와 마찬가지로 ResultSet, Statement 및 Connection에서도 close를 호출해야합니다. –

+0

나는 위의 코드에서 벗어났다. 덕분에 – rockit

0

그런 큰 데이터를 처리하는 또 다른 방법은 행을 반환하고 파일에 계속 기록하는 것입니다. 이렇게하면 문자열 버퍼가 계속 커지지 않으며 파일 시스템에 모든 레코드를 쓰고 나중에 읽을 수 있어야합니다.

+0

감사합니다. 그리고 저는 out.write (strVar_1 + "\ n"); 내가 파일에 데이터를 쓰고있다. – rockit

관련 문제