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

Тема в разделе "Java", создана пользователем codebyner, 9 ноя 2012.

  1. codebyner

    codebyner Гость

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

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

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

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

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

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Может парсер сменить? Если конечно это не сильно сложно в рамках архитектуры приложения.
    VTD-XML
    или
    XOM

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

    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);
     
Загрузка...

Поделиться этой страницей