(outofmemoryerror: пространство кучи Java) при переборе записей оракула - PullRequest
2 голосов
/ 15 марта 2010

привет товарищам по Java.

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

Только это не то, что происходит. Что происходит, так это то, что он получает набор результатов, начинает перебирать строки, печатая в файл, как только идет, до тех пор, пока не закончится память - утверждая, что ему нужно больше места в куче 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();

Ответы [ 2 ]

4 голосов
/ 15 марта 2010

Попробуйте ниже:

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

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

0 голосов
/ 15 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...