2012-03-23 2 views
0

У меня есть приложение, в котором, если я загружаю несколько записей, загрузка моего файла csv работает нормально .... но если есть много записей, есть исключение Java и отладка дает исключение vmdisconnected. Я пытаюсь получить все данные в переменной с именемИсключение кучи пространства при загрузке файла

String content = service.generateCSV(SearchVO); 

это содержимое переменной устанавливается в классе действий, а затем у меня есть класс downloadservlet, в котором я получаю эту переменную содержимого.

String content = (String) request.getAttribute(CONTENT); 

Может кто-нибудь предложить мне, как прочитать содержимое таким образом, что так я могу скачать файл, даже если он имеет много много записей

Это, как я получаю данные из базы данных

`while (sqlRowSet.next()) 
     { 
    data = (DB2Xml) sqlRowSet.getObject(Constants.TABLE_NAME_XML); 
    dl = data.getDB2XmlString();} 

трассировка стека: -

java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOfRange(Unknown Source) 
at java.lang.String.<init>(Unknown Source) 
at java.lang.StringBuffer.toString(Unknown Source) 
at com.ibm.db2.jcc.c.fc.getDB2XmlString(fc.java:187) 
+1

Пожалуйста, пост исключения Java. – barsju

+0

Пожалуйста, укажите больше кода. Если вам нужна помощь, пожалуйста, отформатируйте свой код и т. Д. Http://stackoverflow.com/faq#howtoask –

+0

Я хочу, чтобы вы хранили большие данные в одном блоке памяти. Предоставьте больше кода и Exception-Stacktrace. –

ответ

0

Если вы работаете из кучи пространства вам нужно будет увеличить. Здесь приятно читать о том, как это сделать и как избежать распространенных ошибок:

http://javahowto.blogspot.com/2006/06/6-common-errors-in-setting-java-heap.html

+0

@barsju .... спасибо за сообщение ... но это не то, что я хочу ... – rcky

0

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

Похоже, что service.generateCSVContent создает гигантскую строку, а из трассировки стека выглядит так, как будто это происходит из базы данных DB2? С 2-минутного поиска похоже, что есть stream-based API. Возможно, использование этого поможет решить вашу проблему. Вам просто нужно убедиться, что вы передаете контент между A и B, вместо того, чтобы пытаться поместить все содержимое в переменную.

+0

.... что такое A & B здесь ...... я не хочу возиться с db, потому что я использую тот же запрос базы данных для своих результатов поиска. – rcky

+0

A, вероятно, является базой данных. Получайте материал из базы данных как поток (например, запись по записи, а не все сразу). B - это то, что вы делаете с ним с другой стороны (например, создавая файл CSV). Создайте его по строкам, а не сразу. –

1

Похоже, ваша проблема в том, что вы пытаетесь обработать источник, который слишком велик, чтобы его можно было использовать за один раз в памяти.

Одним из подходов к решению этой проблемы может быть постепенное чтение источника (и обработка данных) (например, строка за строкой), а не всего за один раз.

Это пример того, как прочитать файл с URL постепенно (строка за строкой) и копирование его в другой файл:

  URL url; 
      try { 
       url = new URL(location); 
       BufferedReader in = new BufferedReader(
           new InputStreamReader(url.openStream())); 
       BufferedWriter out = new BufferedWriter(new FileWriter(saveFile)); 
       String buffer; 
       while ((buffer = in.readLine()) != null) { 
        out.write(buffer); 
        // write the file or do whatever you want with it 

       } 
       in.close(); 
       out.close(); 

      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      }