Java 如何将大量数据从数据库存储到XML(内存问题,第二部分)?

Java 如何将大量数据从数据库存储到XML(内存问题,第二部分)?,java,oracle,Java,Oracle,我已经修改并重写了代码以反映解决方案,但现在我遇到了一个新问题。这是代码 这是调用/写入功能;我有8种类型的proizvod,它们生成8个XML文件。创建XML文件后,需要使用自定义zip类对其进行压缩: generateXML(tmpParam,queryRBR,proizvod.getOznaka()); writeToZip(proizvod.getOznaka()); 这在writeToZip中: ZipEntry ze = new ZipEntry(oznaka + ".xml");

我已经修改并重写了代码以反映解决方案,但现在我遇到了一个新问题。这是代码

这是调用/写入功能;我有8种类型的
proizvod
,它们生成8个XML文件。创建XML文件后,需要使用自定义zip类对其进行压缩:

generateXML(tmpParam,queryRBR,proizvod.getOznaka());
writeToZip(proizvod.getOznaka());
这在
writeToZip
中:

ZipEntry ze = new ZipEntry(oznaka + ".xml");
FileOutputStream fos = new FileOutputStream(new File(zipFolder + oznaka + ".zip"));
ZipOutputStream zos = new ZipOutputStream(fos);
zos.putNextEntry(ze);
FileInputStream fis = new FileInputStream(new File(zipFolder + oznaka + ".xml"));
final byte[] buffer = new byte[1024];
int n;
while ((n = fis.read(buffer)) != -1)
    zos.write(buffer, 0, n);
zos.closeEntry();
zos.flush();
zos.close();
fis.close();
这是在generateXML中的
generateXML

PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(zipFolder +oznaka + ".xml")));
writer.print("\n<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
writer.print("\n<PROSTORNE_JEDINICE>");
stmt = cm.getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
String q = "";
rs = stmt.executeQuery(q);
if (rs != null) {
    System.out.println("Početak u : " + Util.nowTime());
    while (rs.next()) {
        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>");
        //etc
        writer.print("\n\t</row>");
    }
    System.out.println("Kraj u : " + Util.nowTime());
}
writer.print("\n</PROSTORNE_JEDINICE>");
PrintWriter writer=new PrintWriter(new BufferedOutputStream(new FileOutputStream(zipFolder+oznaka+“.xml”));
writer.print(“\n”);
writer.print(“\n”);
stmt=cm.getConnection().createStatement(ResultSet.TYPE\u SCROLL\u不敏感,ResultSet.CONCUR\u只读);
字符串q=“”;
rs=标准执行程序(q);
如果(rs!=null){
System.out.println(“Početak u:+Util.nowTime());
while(rs.next()){
writer.print(“\n\t”);
writer.print(“\n\t\t”+Util.transformToHTML(rs.getInt(“id”)+”);
writer.print(“\n\t\t”+Util.transformToHTML(rs.getInt(“jed_id”))+”);
//等
writer.print(“\n\t”);
}
System.out.println(“Kraj u:+Util.nowTime());
}
writer.print(“\n”);

generateXML
part仍然占用大量内存(如果我猜对了,它会一点一点地占用尽可能多的内存),而且我不知道如何优化它(使用另一种方式来提供writer.print函数)

我立即看到的两件事(可能是复制/粘贴错误)是,您没有关闭PrintWriter(writer)在generateXml中,您不关闭WriteToZipFile中的FileOutputStream(fos)


要查找内存故障,我建议您-也许您可以在代码行为中发现一些异常现象。

顺便说一句:
stmt.executeQuery()
从不返回
null
。它要么抛出
SQLException
,要么返回一个非null的
ResultSet
。当您直接从结果集写入文件时,我不会立即看到内存问题可能在哪里。您需要对其进行分析。有关建议,请参阅Tnx,我将对此进行研究。您提供的指向dotTrace的链接链接指向.NET探查器,这似乎对Java应用程序不太有用。Writer在代码后面关闭,但它“不相关”;我对代码进行了注释,因此该方法只运行一次(对于最大的“proizvod”),所以我认为这不会影响它。我只想到两件事,第一件是字符串保存在内存中,第二件是在写入文件时,文件保存在内存中。我想我可以试着在每次迭代中打开然后关闭它?还有,你不需要关闭记录集对象吗@Andrija:在generateXML中,您可以尝试刷新PrintWriter,可能是在写入每一行之后。