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

标签 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();  
                }

并且有效;我得到 12 100 MB 文件。现在,我想做的是将所有数据放在一个文件中(然后压缩),但如果只是删除 if 部分,我就会内存不足。我想尝试写入一个文件,关闭它,然后再打开,但这对我没有太大帮助,因为我必须在打开文件时将文件加载到内存中。

最佳答案

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

但是,这可能是更好的解决方案:

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();

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

关于java - 如何将大量数据从数据库存储到 XML(内存问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2895298/

相关文章:

asp.net - 将 Oracle 数据库用于默认的 ASP.NET MVC 应用程序

java - 有效Java : Analysis of the clone() method

java - 在 Java 中,是否可以强制转换为 void(不是 Void)?

java - Eclipse 上的 Gradle,钻石运算符无法识别?

java - 在java中将实数隔离在复数中

java - 如何在带有注释的mybatis和oracle中插入时返回ID

sql - Excel ODBC 数据连接查询刷新每个查询所需的时间

java - 使用库运行测试任务,但使用 Junit 的 gradle 中不存在包

sql - 有没有办法确定 SQL Server 存储过程返回记录集

java - 插入时oracle + java编码问题