如何将大量数据从数据库存储到XML(内存问题)?

And*_*ija 8 java oracle

首先,我从数据库获取数据时出现问题,它占用了太多内存并且失败了.我已经设置-Xmx1500M并且我正在使用滚动ResultSet以便处理.现在我需要从数据中创建一个XML,但我不能把它放在一个文件中.目前,我这样做:

while(rs.next()){
                i++;
                xmlStringBuilder.append("\n\t<row>");
                xmlStringBuilder.append("\n\t\t<ID>" + Util.transformToHTML(rs.getInt("id")) + "</ID>");
                xmlStringBuilder.append("\n\t\t<JED_ID>" + Util.transformToHTML(rs.getInt("jed_id")) + "</JED_ID>");
                xmlStringBuilder.append("\n\t\t<IME_PJ>" + Util.transformToHTML(rs.getString("ime_pj")) + "</IME_PJ>");
//etc.
                xmlStringBuilder.append("\n\t</row>");
                if (i%100000 == 0){
                                    //stores the data to a file with the name i.xml
                    storeKBR(xmlStringBuilder.toString(),i);
                    xmlStringBuilder= null;
                    xmlStringBuilder= new StringBuilder();  
                }
Run Code Online (Sandbox Code Playgroud)

它有效; 我得到12个100 MB的文件.现在,我想要做的是将所有数据放在一个文件中(我然后压缩),但如果只删除if部分,我就会耗尽内存.我想过尝试写一个文件,关闭它,然后打开,但这不会让我感觉太多,因为我打开它时必须将文件加载到内存中.

Dan*_*son 3

为什么不将所有数据写入一个文件并使用“追加”选项打开该文件?如果您只是要写入文件,则无需读取文件中的所有数据。

然而,这可能是一个更好的解决方案:

PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream("data.xml")));

while(rs.next()){
    i++;
    writer.print("\n\t<row>");
    writer.print("\n\t\t<ID>" + Util.transformToHTML(rs.getInt("id")) + "</ID>");
    writer.print("\n\t\t<JED_ID>" + Util.transformToHTML(rs.getInt("jed_id")) + "</JED_ID>");
    writer.print("\n\t\t<IME_PJ>" + Util.transformToHTML(rs.getString("ime_pj")) + "</IME_PJ>");
    //...

    writer.print("\n\t</row>");
}

writer.close();
Run Code Online (Sandbox Code Playgroud)

BufferedOutputStream 会在打印数据之前对其进行缓冲,如果默认值不符合您的需要,您可以在构造函数中指定缓冲区大小。有关详细信息,请参阅 java API:http://java.sun.com/javase/6/docs/api/