2016-07-17 13 views
0

JPAでバッチインサートを作成しようとしていますが、これはうまくいかないと思います。Hibernate/JPAでのバッチインサートの使用

私の方法はこれです:

public void saveBatch(List<? extends AbstractBean> beans) { 
    try { 
     begin(); 
     logger.info("Salvando em batch " + beans.size() + " bean(s)"); 
     for (int i = 0; i < beans.size(); i++) { 
     if (i % 50 == 0) { 
      entityManager.flush(); 
      entityManager.clear(); 
     } 
     entityManager.merge(beans.get(i)); 

     } 
     commit(); 
    } catch (Exception e) { 
     logger.error("Ocorreu um erro ao tentar salvar batch. MSG ORIGINAL: " 
       + e.getMessage()); 
     rollback(); 
     throw new DAOException("Ocorreu um erro ao tentar salvar batch"); 
    } 
    } 

私ideiaは、それぞれ50行はHibernateが作るということです。

insert into tableA values(),(),()... 

をしかし、私は、各マージ()コマンドリンクのための1つのINSERTを参照ログを見てこれは:

insert into tableA values() 
insert into tableA values() 
insert into tableA values() 
insert into tableA values() 

どうしたのですか?これは正しいです ?

+0

あなたのJPAインプは何ですか?それはに依存しています。 有効にするためにJPA confを変更しましたか? はいの場合、どうですか? – davidxxx

+0

私のjpaは2.1、休止状態を使用しています。私はjpa configで何も修正していません。 – RonaldoLanhellas

+0

可能な複製http://stackoverflow.com/questions/20285347/massive-insert-with-jpa-hibernate – Rob

答えて

1

Hibernateはデフォルトでバッチ処理を有効にしません。次のsettings(私は少なくともbatch_sizeは、任意のバッチ挿入/更新が仕事を得るために必要だと思う)を考慮することになるでしょう:

hibernate.jdbc.batch_size 

非ゼロ値はHibernateがJDBC2のバッチ更新の使用を可能にします。例えばあなたのJDBCドライバを返す場合、このプロパティをtrueに設定して5〜30

hibernate.jdbc.batch_versioned_data 

間 推奨値正しい行がexecuteBatch(から カウント)。通常、このオプションをオンにしても安全です。 Hibernateは自動的にバージョニングされたデータにバッチDMLを使用します。 デフォルトはfalseです。例えば真実|偽

hibernate.order_updates (similarly, hibernate.order_inserts) 

軍更新され 項目の主キー値によってSQLの更新を注文する休止状態。これにより、並行性の高いシステムではトランザクションのデッドロックが少なくなります( )。例えば真実|偽

+0

私はpersistente.xmlにbatch_sizeを追加しましたが、問題は継続します。なぜ私はそれを制御している場合、私はこのプロパティを使用する必要があります理解できません。 – RonaldoLanhellas

関連する問題