java - 当我基于 json 数组创建 json 对象时内存不足

标签 java json web-services tomcat out-of-memory

我在 java 中创建了一个 Web 服务来返回 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) {

      }
}

在 jsonArray 中添加图像时发生内存不足(java.lang.OutOfMemoryError:Java 堆空间):

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

知道如何解决这个问题吗?

最佳答案

使用 Jackson 库中的流 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
    }
}

关于java - 当我基于 json 数组创建 json 对象时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15070240/

相关文章:

java - Spring 批处理 : Specifying chunk size for processing List of Lists

java - 对象镜像其他对象

java - 如何使用java替换文本文件中的字符串?

json - 如何将bash中的文件转换为json

Java REST Spring 3.2.3 apache cxf 2.7.5 生成 XML 正常,但无法生成 JSON

java - 从 CXF 2.7 升级到 CXF 3.0

java - 如何实现对象的重复

c# - 返回 Json,但它包含反斜杠 "\",我不想要

java - 如何在soap webservice中添加 "content-type" header

c# - 通过网络服务和 jquery 下载文件?