ssqzh 2010-05-08 14:56
浏览 761
已采纳

关于Java生产JSON,内存占用特别大的问题!

无论是使用JSON-Lib 或者 GSON库,内存占用特别的大,而且生成的结果也特别的大!自己手动生成的还可以的,我的代码如下:

[code="java"]public static String getJSONArray(String sql) {
Connection conn = null;
JsonArray rul = null;
try {
conn = DbToolkit.getConnection();
Statement stat = conn.createStatement();
boolean isrs = stat.execute(sql);
int h = 0;
do {
if (isrs) {
rul = new JsonArray();
ResultSet rs = stat.getResultSet();
ResultSetMetaData rsmd = rs.getMetaData();
while (rs.next()) {
System.out.println(h++);
//JSONObject jo = new JSONObject();
JsonObject jo = new JsonObject();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
//jo.put(rsmd.getColumnName(i), rs.getString(i));
jo.addProperty(rsmd.getColumnName(i), rs.getString(i));
System.out.print(String.format("%s,%s", rsmd.getColumnName(i), rs.getString(i)));
//rul.put(jo);
rul.add(jo);
}
System.out.println();
}
break;
}
isrs = stat.getMoreResults();
} while (stat.getUpdateCount() != -1 || isrs == true);
conn.close();
} catch (Exception ex) {
Logger.getLogger(SQL2JSON.class.getName()).log(Level.SEVERE, null, ex);
}

return rul.toString();
}

    public static void PrintWriteJson(String sql,PrintWriter out){
            Connection conn = null;
            try {
                    conn = DbToolkit.getConnection();
                    Statement stat = conn.createStatement();
                    boolean isrs = stat.execute(sql);
                    int h = 0;
                    do {
                            if (isrs) {
                                    ResultSet rs = stat.getResultSet();
                                    ResultSetMetaData rsmd = rs.getMetaData();
                                    out.print("[");
                                    while (rs.next()) {
                                            if(h++ >0){
                                                    out.print(",");
                                            }
                                            out.print("{");
                                            for (int i = 1; i <= rsmd.getColumnCount(); i++) {
                                                    if(i>1){
                                                            out.print(",");
                                                    }
                                                    out.print(String.format("%s:\"%s\"", rsmd.getColumnName(i), rs.getString(i)));
                                            }
                                            out.print("}");
                                    }
                                    out.print("]");
                                    break;
                            }
                            isrs = stat.getMoreResults();
                    } while (stat.getUpdateCount() != -1 || isrs == true);
                    conn.close();
            } catch (Exception ex) {
                    Logger.getLogger(SQL2JSON.class.getName()).log(Level.SEVERE, null, ex);
            }
    }[/code]
  • 写回答

2条回答

  • qwe_rt 2010-05-08 15:12
    关注

    一般情况下是没有这种问题的,但是如果使用java对象转化为json时,很有可能出现死循环。这中死循环在使用Hibernate和json-lib时是常出现的问题,可以通过setExclude()方法解决。

    详细参看:http://jiangzhengjun.iteye.com/blog/467246

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站