• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Sax-парсер И Большой Xml-файл

  • Автор темы codebyner
  • Дата начала
C

codebyner

Здравствуйте форумчане.

Заглянул к вам в поисках ответа на один вопрос.
В общем я пытаюсь распарсить большой xml-файл (около 1 Гб) и перенести его структуру в MySql.
Так надо! )

С небольшими файлами программа работает нормально. Но когда передаю ей большой файл, то после длительной работы (мин. 30 - 60 может больше) программа прекращает работу, без каких-либо StackTrace`ов и выводов в консоль. Если запустить под дебагом, то в результате - "Source not found".
В названии таба написано:
XIncludeAwareParserConfiguration(XML11Configuration).parse(XMLInputSourse) line: 768

В гугле смотрел, ничего вразумительного не нашел.
Может быть кто-нибудь сталкивался с такой проблемой.

P.S.
Работаю в Eclipse под Linux. На всякий случай.
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
Может парсер сменить? Если конечно это не сильно сложно в рамках архитектуры приложения.

или


А так еще можно постоянно логировать действия, поискать после какой итерации или на каком документе выпадает.
 
C

codebyner

Разобрался с проблемой, уже давно правда. Редко сюда захожу.
Смотрю на свой пост и думаю, как я мог так написать. Сам с трудом припоминаю в чем была проблема. Информации в сообщении почти никакой))

Ну судя по всему я тогда использовал SAX-парсер. Так как думаю обычный загнулся бы еще на старте)
Значит, проблема была в том, что у меня заканчивалась память в стеке. Я неправильно работал с базой данных. Оказывается нужно освобождать определенные ресурсы самому, после выполнения запроса.

С базой я работал через com.mysql.jdbc.Driver.

Пример кода, который освобождает ресурсы.

C++:
public boolean query(String query){
Statement s = null;
boolean result = false;

try {
s = connection.createStatement();
s.execute(query);
result = true;
}
catch (SQLException e) {
lastError = e.getMessage();
e.printStackTrace();
}
finally {
if(s != null){
try {
s.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}

return result;
}

Кроме того если вы получаете ссылку на объект ResultSet, то его тоже необходимо закрыть после использования.

C++:
ResultSet result = selectStatement.executeQuery(query);
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!