3

JSONデータを返すWebサービスをJavaで作成しました。小さなデータには問題ありませんが、大きなデータを扱うとメモリ不足エラーが返されます。

私のコードを見てください:

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 ヒープ領域) は、jsonArray に画像を追加した瞬間に発生します:

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

問題を解決する方法はありますか?

4

2 に答える 2

2

Jackson Library のストリーム 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
    }
}
于 2014-06-18T03:11:14.743 に答える
1

単純に URL を画像に返して、ブラウザにそのリソースをプルさせてみませんか? Javaが送信する前にイメージセットをメモリに保持する必要があるため、json応答を介して渡す利点はよくわかりません。

于 2013-02-25T15:25:03.923 に答える