有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在json数组中创建json对象时,java内存不足

我用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);

你知道怎么解决这个问题吗


共 (2) 个答案

  1. # 1 楼答案

    使用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
        }
    }
    
  2. # 2 楼答案

    为什么不简单地将url返回到图像,让浏览器提取该资源?我不太明白通过json响应传递它的好处,因为您需要java在发送图像集之前将其保存在内存中