NetbeanがSaxpを使用しているときに応答せず、読み込みおよび休止状態でlageデータベースを保存する

私のプロジェクトは、 dblp のxmlファイルを解析します.ORMに保存するには約1Gbです私はSAXPを使って(paper'author、paper'infomation ......)のような情報を読み込み、Hibeanateを使ってデータベースにデータを保存します:

ステップ1:SAXPを使用して、次のような要素を読み込みます。

Data Ram BhaskarKasim Karam AbdallaRaj Senani<title>Electronically-Controlled Current-mode second order Sinusoidal Oscillators Using MO-OTAs and Grounded Capacitors.</title>65-7320112Circuits and Systems2http://dx.doi.org/10.4236/cs.2011.22011db/journals/cs/cs2.html#BhaskarAS11

取得する:出版者の著者名、一般公開者、出版者、...

ステップ2:作成者、発行者、...データベースの複製を確認します。 ステップ3:パブリケーションをデータベースに保存する End:データベースを終了するまで次の要素に移動します。

私が約10MBのファイルdblpを実行すると、ok(11分)が実行されます - データベースに約21000件の公開を入力します。しかし、フルdblpファイル(1GB)を実行すると、約75000パブ(約1日)のNetBeansが応答しませんでした - 私はnetBeanからエラーやメッセージを受け取ることができません - それはどんなパブ(ただしDBLPには約1,7百万パブがあります)。

申し訳ありませんが長い質問が、私は非常にあなたのいずれかの私に与えることができる任意のヘルプに感謝したい!問題はSAXPですか?または休止状態....?

ここでいくつかのコード:

休止状態の設定:


  
    org.hibernate.dialect.MySQLDialect
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/cspublicationcrawler
    root
    root
    false
    true

    50
    500 
    org.hibernate.context.ThreadLocalSessionContext
    
    
    
    
    
    
    
    
    
    
    
  

休止状態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 ();       
        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;
    }
} 
3
ちょっとしたメモリと時間節約: TreeSet i.o. HashSet
追加された 著者 Joop Eggen,

2 答え

netbeans(またはあなたのコードを実行する他のツール)がクラッシュする理由は簡単です。大規模なデータセットでは、Hibernateのステートフルセッションは大量のメモリを消費します。

The Solution : Use a "stateless" hibernate session - you are supposed to use stateless sessions (which don't track the state of your objects) for large hibernate ETL jobs.

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

Why "StatelessSessions" are important for ETL style hibernate jobs : Since typical JVMs run with < 1g ram, you must be careful that youre not cacheing objects in a session when loading 10 gigs of data via hibernate.

Other optimizations :

1)非常に高性能のサーバー、またはデータベースサーバーのローカルサーバー上で休止状態のプログラムを実行します。

2)インポーターの実行中に、データベース・サーバー内の外部キー検査および索引付けを使用不可にします。

3) Look into other hibernate java/GC optimizations, for example, reducing garbage collection duties or increasing JVM memory. Java Application Server Performance

この問題を解決するには、セッションの種類を変更し、挿入、コミット、およびフラッシュの方法を少し変更する必要があります。

さまざまなセッションタイプを使用する理由:

休止状態が遅くなったり応答しなくなったりすると、おそらくJVmを押していることを意味します(つまり、JVMメモリで管理されているオブジェクトをたくさん作成しています)。 Hibernateの優れたWebアプリケーションのパフォーマンスは、データベースでクエリまたは更新するBeanの状態やライフサイクルを管理できるためです。通常、隠されたコストを実現することなく、標準のWebアプリケーションでこの利点を得ています。したがって、大規模なETLスタイルのデータベースプログラミングでは、キャッシュを必要とせず、状態もなく高速で書き込みを行います。これは、ステートレスセッションを使用することを意味します。ステートレスセッションは、ウェブに最適化されたハイバネート状態のステートフルなセッション管理を試みません。

2
追加された
私はテーブルexaple:author_paper(idauthor、idpaper)との間のテーブルマッピングへのインポートを提案しています。私はセッションでそれを実行する場合は、著者の列と紙のコリムのデータを持っているときに自動インポート - >私は設定リング。しかし、私はStatelessSessionsを使用して私はchage seseion私はデータをインポートすることはできません?
追加された 著者 tiendv,

そのような多くのデータをロードする場合は、hibernateをスキップすることを検討し、準備済みのステートメントにバッチ・インサートを使用してJDBCを使用してください。また、あなたのサックスパーサーがアイテムをデータベースに挿入した後にアイテムを保持していないことを確認したら、すぐにメモリ不足になります。

0
追加された