2017-09-12 5 views
0

バッチ処理のためにHibernateを設定しようとしています。私はサンプルアプリケーションを構築し、Hibernateの文書に従って設定しました。Hibernateバッチ処理

しかし、それはすべてが、単に個々のインサートでバッチ挿入を行っていないようにSQLをログアウトするにHibernateを構成した後、それが見えます。このログを間違って読んでいますか?

だから、私は春ブーツアプリで構成され、以下の特性を持っています。ここで

spring.jpa.properties.hibernate.jdbc.batch_size=10 
spring.jpa.properties.hibernate.show_sql=true 
spring.jpa.properties.hibernate.format_sql=true 

は私の非常に基本的なバッチライター..です

@Transactional public class BatchWriter {

private EntityManager entityManager; 

private int batchSize; 

public BatchWriter(EntityManager entityManager, int batchSize) { 
    this.entityManager = entityManager; 
    this.batchSize = batchSize; 
} 

public void writeBatchOfCustomers(int numOf) { 
    for(long i = 0; i <= numOf; i++) { 
     Customer customer = new Customer(i); 
     entityManager.persist(customer); 

     if (i % batchSize == 0) { //20, same as the JDBC batch size 
      //flush a batch of inserts and release memory: 
      entityManager.flush(); 
      entityManager.clear(); 
     } 
    } 
} 

}

今、私は、例えば、20人のお客様を挿入するために、これを実行していると、休止状態のログに、私は、次の20回見ています:

Hibernate: 
insert 
into 
    customer 
    (first_name, last_name, id) 
values 
    (?, ?, ?) 

私はここで何をしないのですか?

現在はH2データベースと春のブート自動構成を使用しています。しかし、私は最終的にSpring BatchとOracle dbで使用することを検討しています。これは約35個の属性を持つ約30k個のオブジェクトを挿入します。

助けてください。

おかげで、

+0

なぜJPAを設定しているときにSessioNFactoryを使用していますか? 'SessionFactory'ではなく、' EntityManager'を使うべきです。 –

+0

そのコードは、hibernateのドキュメントから十分に近いところにコピーされているので、それはただ捨ててしまいます。私は影響を見ませんでしたか? – buymypies

+0

もう一度JPAを設定していますが、単純な 'SessionFactory'を使用しています。あなたはXを設定していますが、Yを使用しています。Xを設定するとYに影響するのはなぜですか?記述されているように、 'EntityManager'を使用して(ライターに注入して)' @ Transactional'でアノテーションを付けます。持っているHibernateの設定をすべて削除して、Spring BootでJPAを設定してください。 –

答えて

1

だから、休止状態のSQLのログではなく(私の意見では)誤解されることが表示されます。

私の構成は、実際のバッチ処理にありました。

私はこのクラスのレベルDEBUGでロガーを追加しました:として、現在Hibernateのバージョン5.0.12で命名

org.hibernate.engine.jdbc.batch.internal.BatchingBatch

。 (以前は何か他の名前が付けられていると思う)。あなたがそれを見ることができます。このクラスでは

は、実際のバッチ処理です。