2012-03-23 55 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 2012-03-23 12:53:04

+0

請提供更多代碼。如果你想得到一些幫助,所以請格式化你的代碼等。http://stackoverflow.com/faq#howtoask – 2012-03-23 12:54:19

+0

我發現你存儲到一個內存塊的大數據。提供更多的代碼和Exception-Stacktrace。 – 2012-03-23 12:56:38

回答

0

從廣義上講,要對使用數據流,而不是將所有的數據到內存中,在移動一旦。

它看起來像service.generateCSVContent產生一個巨大的字符串,並從棧跟蹤看起來這是來自一個DB2數據庫?從2分鐘的搜索,它看起來像有一個stream-based API。也許使用這將有助於解決您的問題。您只需確保在A和B之間傳輸內容,而不是試圖將整個內容放入變量中。

+0

....什麼是A&B在這裏......我不想惹數據庫,因爲我使用相同的數據庫查詢來搜索我的搜索結果 – rcky 2012-03-26 07:29:36

+0

A可能是數據庫。以數據流的形式從數據庫獲取內容(例如,按記錄記錄,而不是一次記錄)。 B是你在做另一面的事情(例如,生成CSV文件)。一行一行地生成,而不是一次全部生成。 – 2012-03-26 08:00:35

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