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

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

codebyner

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

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

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

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

P.S.
Работаю в Eclipse под Linux. На всякий случай.
 
Может парсер сменить? Если конечно это не сильно сложно в рамках архитектуры приложения.
VTD-XML
или
XOM

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

Ну судя по всему я тогда использовал 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);
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab