Как я могу сохранить большой объем данных из базы данных в XML (проблема с памятью, часть вторая)? - PullRequest
1 голос
/ 25 мая 2010

Я задал вопрос на днях и переписал код, чтобы отразить решения, но теперь у меня появилась новая проблема. Вот код.

Это функция вызова / записи; У меня есть 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:

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

generateXML часть по-прежнему занимает много памяти (если я правильно угадываю, она занимает по крупицам столько, сколько может), и я не вижу, как я мог бы ее оптимизировать (использовать альтернативный способ подачи функция writer.print)?

1 Ответ

0 голосов
/ 25 мая 2010

две вещи, которые я вижу сразу (возможно, ошибка копирования / вставки), заключаются в том, что вы не закрываете PrintWriter (модуль записи) в generateXml и не закрываете FileOutputStream (fos) в WriteToZipFile.

Чтобы найти ошибки памяти, я бы порекомендовал dotTrace - может быть, вы обнаружите некоторые нарушения в поведении кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...