2011-12-19 3 views
3

Мой файл синтаксического анализа XML-файла от dblp, он около 1 ГБ для сохранения в базе данных ORM, поэтому я использую SAXP для чтения данных, таких как (paper'author, paper'infomation. .....) и использовать Hibeanate для сохранения данных в базе данных для:Netbean не отвечает при использовании Saxp read и hibernate. Сохраняет базу данных lage.

Шаг 1: используйте SAXP прочитать элемент вроде этого:

<article key="journals/cs/BhaskarAS11" mdate="2011-11-09"><author>Data Ram Bhaskar</author><author>Kasim Karam Abdalla</author><author>Raj Senani</author><title>Electronically-Controlled Current-mode second order Sinusoidal Oscillators Using MO-OTAs and Grounded Capacitors.</title><pages>65-73</pages><year>2011</year><volume>2</volume><journal>Circuits and Systems</journal><number>2</number><ee>http://dx.doi.org/10.4236/cs.2011.22011</ee><url>db/journals/cs/cs2.html#BhaskarAS11</url></article> 

чтобы получить: Author'name, publicaiton, издатель,. .. публикации

Этап 2: Проверка депиляции Автор, издательство sher, ... в базе данных. Шаг 3: Сохранение публикации в базе данных Конец: переход к следующему элементу до конечной базы данных.

Когда я запускаю файл dblp около 10 МБ, он работает нормально (11 минут) - он вводит около 21000 сообщений в базу данных. Но при запуске полного dblp-файла (1 ГБ), когда пила в базе данных составляет около 75000 пабов (около 1 дня), Netbean не реагирует - я не могу получить никаких ошибок или сообщений от netBean - и он не вводит ни один паб в базу данных (но в dblp есть около 1,7 milion pub).

Извините за длинный вопрос, но я очень признателен за любую помощь, которую любой из вас может дать мне! проблема SAXP? или спящий режим ....?

Вот некоторые код:

Hibernate конфигурации:

<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/cspublicationcrawler</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.connection.password">root</property> 
    <property name="hibernate.transaction.auto_close_session">false</property> 
    <property name="hibernate.transaction.flush_before_completion">true</property> 

    <property name="hibernate.connection.pool_size">50</property> 
    <property name ="hibernate.jdbc.batch_size">500</property> 
    <property name="hibernate.current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/Magazine.hbm.xml"/> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/Reviewer.hbm.xml"/> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/Conference.hbm.xml"/> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/Author.hbm.xml"/> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/Paper.hbm.xml"/> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/RankAuthorKeyword.hbm.xml"/> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/Publisher.hbm.xml"/> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/Comment.hbm.xml"/> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/Domain.hbm.xml"/> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/Journal.hbm.xml"/> 
    <mapping resource="uit/tkorg/cspublicationtool/entities/PaperType.hbm.xml"/> 
    </session-factory> 

Hibernate Util

public HibernateUtil() throws Exception { 
    sessionFactoryConfigPath = ""; 
    sessionFactory = new Configuration().configure().buildSessionFactory(); 
} 

public HibernateUtil(String sessionFactoryConfigPath) { 
    this.sessionFactoryConfigPath = sessionFactoryConfigPath; 
    sessionFactory = new Configuration().configure(sessionFactoryConfigPath).buildSessionFactory(); 
} 

/** 
* Begin a transaction 
*/ 
protected void beginTransaction() { 
    session = sessionFactory.getCurrentSession(); 
    session.beginTransaction(); 
} 

/** 
* Commit transaction and close session 
*/ 
protected void commitAndClose() { 
    if (session != null) { 
     for(int i=0;i<10000;i++) { 
      if (i % 500 == 0) { //50, same as the JDBC batch size 
           //flush a batch of inserts and release memory: 
        session.flush(); 
        session.clear(); 
      }    
     } 
     session.getTransaction().commit(); 
     if (session.isOpen()) { 
      session.close(); 
     } 
    } 
} 

SAXP

public void endElement(String uri, String localName, String qName) throws SAXException { 
    try { 
     if(!recordTag.equals(WWW)&&!recordTag.equals(PROCEEDINGS)){ 
      super.endElement(uri, localName, qName); 
      if(this.str != null){ 
       this.value = this.str.toString(); 
      } 
      if (qName.equals(AUTHOR) || qName.equals(EDITOR)) { 
       try {       
        String temp = value.replaceAll("'",""); 
        author = this.authorBO.checkExitAuthor(temp); 
        if (author ==null) 
        { 
         author = new Author(); 
         author.setAuthorName(value); 
         authorBO.addNew(author); 
        } 
        authors.add(author); 
        author=null; 
       return; 
       } catch (Exception ex) { 
        Logger.getLogger(CSPublicationSAXEventHandler.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
      if(qName.equals(TITLE)){ 
       this.paper.setTitle(value); 
       return; 
      } 

      if(qName.equals(BOOKTITLE)){ 
       if(recordTag.equals(INPROCEEDINGS)){ 
        String temp = value.replaceAll("'",""); 
        conference = conferenceBO.checkExitConference(temp); 
        if(conference == null) 
        { 
         conference = new Conference(); 
         conference.setConferenceName(value); 
         conferenceBO.addNew(conference); 
         this.paper.setConference(conference); 
         conference=null; 
         return; 
        } 
       }else { 
        this.paper.setTitle(value); 
        return; 
       } 
      } 

      if(qName.equals(PAGES)){ 
       this.paper.setPages(value); 
       return; 
      } 

      if(qName.equals(YEAR)){ 
       this.paper.setYear(Integer.parseInt(value)); 
       return; 
      } 

      if(qName.equals(ADDRESS)){ 
       this.paper.setAdress(value); 
       return; 
      } 
      if(qName.equals(JOURNAL)){ 
       try { 
        String temp = value.replaceAll("'",""); 
        journal = this.journalBO.checkExitJournal(temp); 
        if (journal ==null) 
        { 
         journal = new Journal(); 
         journal.setJournalName(value); 
         journalBO.addNew(journal); 
        } 

        this.paper.setJournal(journal); 
        journal =null;       
        return; 
       } catch (Exception ex) { 
        Logger.getLogger(CSPublicationSAXEventHandler.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 

      if(qName.equals(VOLUME)){ 
       this.paper.setVolume(value); 
       return; 
      } 

      if(qName.equals(NUMBER)){ 
       this.paper.setNumber(value); 
       return; 
      } 

      if(qName.equals(MONTH)){ 
       this.paper.setMonth(value); 
       return; 
      } 

      if(qName.equals(URL)){ 
       this.paper.setUrl(value); 
       return; 
      } 

      if(qName.equals(EE)){ 
       this.paper.setEe(value); 
       return; 
      } 

      if(qName.equals(CDROM)){ 
       this.paper.setCdrom(value); 
       return; 
      } 

      if(qName.equals(CITE)){ 
       this.paper.setCite(value); 
       return; 
      } 

      if(qName.equals(PUBLISHER)){ 
       try { 
        String temp = value.replaceAll("'",""); 
        publisher =publisherBO.checkExitPublisher(temp); 
        if (publisher ==null) 
        { 
         publisher = new Publisher(); 
         publisher.setNamePublisher(value); 
         publisherBO.addNew(publisher); 
        } 

        this.paper.setPublisher(publisher); 
        publisher=null;       
        return; 
       } catch (Exception ex) { 
        Logger.getLogger(CSPublicationSAXEventHandler.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 

      if(qName.equals(CROSSREF)){ 
       this.paper.setCrossref(value); 
       return; 
      } 

      if(qName.equals(ISBN)){ 
       this.paper.setIsbn(value); 
       return; 
      } 

      if(qName.equals(SERIES)){ 
       this.paper.setSeries(value); 
       return; 
      } 

      if(qName.equals(SCHOOL)){ 
       this.paper.setSchool(value); 
       return; 
      } 

      if(qName.equals(CHAPTER)){ 
       this.paper.setChapter(value); 
       return; 
      } 

      if (qName.equals(recordTag)) { 
       this.paper.setAuthors(authors); 
       this.paperBO.addNew(paper); 
       if(this.authors != null){ 
        this.authors = null; 
       } 
       if(this.paper != null){ 
        this.paper = null; 
       } 
       if(this.str != null){ 
        this.str = null; 
       } 
       return; 
      } 
     } 
    } catch (Exception ex) { 
     Logger.getLogger(CSPublicationSAXEventHandler.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void endDocument() throws SAXException { 
    super.endDocument(); 
} 

@Override 
public void startDocument() throws SAXException { 
    super.startDocument(); 
    try { 
     str = new StringBuffer(); 
     this.authorBO = AuthorBO.getAuthorBO(); 
     this.conferenceBO = ConferenceBO.getConferenceBO(); 
     this.journalBO = JournalBO.getJournalBO(); 
     this.publisherBO = PublisherBO.getPublisherBO(); 
     this.paperTypeBO = PaperTypeBO.getPaperTypeBO(); 
     this.paperBO = PaperBO.getPaperBO(); 
    } catch (Exception ex) { 
     Logger.getLogger(CSPublicationSAXEventHandler.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
    super.startElement(uri, localName, qName, attributes);  
    this.str = new StringBuffer(); 
    if ((attributes.getLength()>0) && (attributes.getValue("key")!=null)) { 
     recordTag = qName; 
     this.paper = new Paper();    
     this.authors = new HashSet <Author>();  
     this.paper.setDblpKey(attributes.getValue("key"));    
     if(!recordTag.equals(WWW)&&!recordTag.equals(PROCEEDINGS)) 
     { 
      papertype = this.paperTypeBO.checkExitPaperType(qName); 
      if (papertype ==null) 
      { 
       try { 
        papertype = new PaperType(); 
        papertype.setNameType(qName); 
        paperTypeBO.addNew(papertype); 
       } catch (Exception ex) { 
        Logger.getLogger(CSPublicationSAXEventHandler.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
      this.paper.setPaperType(papertype); 
      papertype=null; 
     } 
     return; 
    } 
} 
+0

Просто крошечная память и временная заставка: 'TreeSet < Author >' i.o. 'HashSet'. –

ответ

2

Причина netbean s (или любой другой инструмент, который запускает ваш код): простота: на больших наборах данных сеансы спящего режима спящего режима занимают много памяти.

Решение: Используйте «без гражданства» спящий режим сеанса - вы должны использовать лицо без сессий (которые не отслеживают состояние ваших объектов) для больших зимует ETL рабочих мест.

//edit the session creation method in HibernateUtil as follows. 
    StatelessSession session = sessionFactory.openStatelessSession(); 

Почему «StatelessSessions» имеет важное значение для ETL стиль рабочих мест в спящем режиме: Поскольку типичные JVMs работать с < 1g бараном, вы должны быть осторожны, что Youre не кэширование объектов в сеансе при загрузке 10 гигабайта данных через спящий режим ,

Других оптимизации:

1) Запустите программу гибернации на чрезвычайно высокую производительность сервер, или тот, который является локальным по отношению к серверу базы данных.

2) Отключите любые проверки и индексирование внешних ключей на сервере базы данных при запуске импортера.

3) Посмотрите на другие оптимизации hibernate java/GC, например, уменьшая обязанности по сбору мусора или увеличивая объем памяти JVM. Java Application Server Performance

Для устранения этой проблемы вам необходимо изменить тип сеанса - и внести незначительные изменения в способ вставки, фиксации и очистки.

Почему мы используем различные виды сессии:

Когда спящий режим замедляется или перестает отвечать на запросы, это, вероятно, означает, что ваш подталкивают Jvm тоже это ограничение в терминах памяти (то есть, вы создали много объекты, которые управляются в JVM-памяти). Отличная производительность веб-приложения Hibernate объясняется его способностью управлять состоянием и жизненным циклом компонентов, которые он запрашивает или обновляет в базе данных. Обычно мы используем преимущества этого в стандартных веб-приложениях, не понимая скрытых затрат. Поэтому, когда мы делаем большое, программирование базы данных в стиле ETL, мы не нуждаемся в кеше, но не просто записываем на высокой скорости. Это означает использование сеанса без сохранения состояния, который не пытается оптимизировать сеансовое управление с помощью спящего режима с помощью веб-оптимизированного пользователя.

+0

У меня есть proplem с импортом в таблицу сопоставления betwent к таблице exaple: author_paper (idauthor, idpaper). Если я запускаю сеанс, он автоматически импортируется, когда у вас есть данные в столбце author и в файле colim -> i config ringt. Но когда я читаю seseion, используя StatelessSessions, я не могу импортировать данные? – tiendv

0

Если вы собираетесь загрузить столько данных, вам следует рассмотреть возможность пропустить спящий режим и просто использовать JDBC с пакетными вставками в подготовленном сообщении. Также убедитесь, что ваш саксовый парсер не укладывается в элементы после того, как они были вставлены в базу данных, вы быстро исчерпаете память.