2010-03-15 4 views
2

привет разработчикам Java.(outofmemoryerror: java heap space) при повторении через записи оракула

У меня здесь проблема. У меня есть код, который получает набор результатов из базы данных оракула, печатает каждую строку в файле, затем получает следующую строку и продолжается до конца набора результатов.

Только это не то, что происходит. Что происходит, так это то, что он получает набор результатов, запускает итерацию по строкам, печатает в файл по мере его поступления, пока не закончится память - он требует, чтобы ему было больше места в куче java.

Приложение в настоящее время работает с 2 г памяти в куче, а код разбивается примерно на 150000-й строке.

Я использую jodbc6.jar и Java 6

Вот идея о том, что делает мой код:

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); 

Это будет контролировать одновременно записывается множество записей.

+0

Хорошо, попробуем и отправьте отчет (запрос занимает некоторое время, чтобы возвращать записи по всей сети) спасибо – rockit

+0

Я понял, что ваш запрос возвращал довольно большое количество строк. Также, как примечание, вы также должны позвонить close на ResultSet, Statement и Connection. –

+0

Я просто оставил его вне кода выше - спасибо – rockit

0

Ну, может быть, еще один способ справиться с такими большими данными - продолжать возвращать строку и записывать ее в файл. Таким образом, строковый буфер не продолжает расти, и вы должны иметь возможность записывать все записи в файловую систему, а затем читать их поздно.

+0

Спасибо - и я делаю out.write (strVar_1 + "\ n"); я пишу данные в файл. – rockit

Смежные вопросы