2013-02-25 60 views
2

我在java中創建了一個web服務來返回json數據。好的,對於小數據沒有問題,但是當我處理大數據時,它會返回內存不足錯誤。當我在json數組中創建一個json對象時內存不足

見我的代碼:

public void getImages() throws Exception { 
     JSONObject o = new JSONObject(); 
     JSONArray jsonArray = new JSONArray(); 

     try { 
       Class.forName(DRIVERNAME); 
       conn = DriverManager.getConnection(URL, USER, PASS); 

       Statement s = connection.createStatement(); 
       ResultSet r = s.executeQuery("select * from images"); 

       while (r.next()) { 
          JSONObject obj = new JSONObject(); 

          obj.put("id", r.getInt("id")); 

          byte[] iBytes = r.getBytes("image"); 
          String iBase64 = DatatypeConverter.printBase64Binary(iBytes); 
          obj.put("image", iBase64); 

          jsonArray.put(obj); 
       } 

       o.put("images", jsonArray); 

     } catch (SQLException e) { 

     } 
} 

的內存不足(java.lang.OutOfMemoryError:Java堆空間)happenning此刻在jsonArray添加圖像:

byte[] iBytes = r.getBytes("image"); 
String iBase64 = DatatypeConverter.printBase64Binary(iBytes); 
obj.put("image", iBase64); 

任何想法如何解決問題?

+0

要麼不這樣做,要麼增加可用內存量。 – 2013-02-25 15:22:12

+0

您通常在一次通話中檢索多少張圖像,並且它們有多大?您當前的代碼非常耗費內存,如果您遇到OOM問題,則需要增加程序可用的內存量,或者改進邏輯以減少嘗試發送回客戶端的數據量。 – Perception 2013-02-25 15:22:51

+0

您確定要通過json傳輸圖像字節數據嗎?也許你可以設置圖像大小的限制或調整它們的大小,如果你真的想這樣做。 – 2013-02-25 15:25:00

回答

2

解決你的問題與傑克遜圖書館的流json(ObjectMapper,JsonFactory,JsonGenerator)。請參閱下面的代碼:

public void getImages() throws Exception { 

    ObjectMapper objectMapper = new ObjectMapper(); 
    JsonFactory jf = objectMapper.getFactory(); 
    JsonGenerator jg = f.createGenerator(new File("c:\\images.json"), JsonEncoding.UTF8); 

    try { 
     Class.forName(DRIVERNAME); 
     conn = DriverManager.getConnection(URL, USER, PASS); 

     Statement s = connection.createStatement(); 
     ResultSet r = s.executeQuery("select * from images"); 

     jg.writeFieldName("images"); 
     jg.writeStartArray(); 

     while (r.next()) { 
      jg.writeBinary(r.getBinaryStream("IMAGEM"), -1); 
      in.close(); 
     } 

     jg.writeEndArray(); 
     jg.writeEndObject(); 
     jg.close(); 

    } catch (SQLException e) { 
     //use the exceptions 
    } 
} 
+0

什麼是你在這裏的「in」變量......你忘了寫startStart()。 – cdietschrun 2014-10-28 15:16:25

1

你爲什麼不簡單地將url返回給圖像,並讓瀏覽器拉動該資源?我不太明白通過json響應傳遞它的好處,因爲你需要在發送它之前將java保存在內存中。

+0

我無法這樣做,因爲移動應用程序將脫機工作。因此,用戶移動應用程序不訪問互聯網來請求網址。 – 2013-02-25 15:44:17

+0

在這種情況下,您需要將堆大小配置爲更大 – 75inchpianist 2013-02-25 15:49:52

+0

我評論了創建映像的行以及內存不足問題。 – 2013-02-25 15:54:49