2

現在、entitymanager を使用して、このようなコードを使用して、オブジェクト エンティティのリストをデータベースに挿入しています。

@Transaction
public void insertBatch(List<EntityObject> o){
    for(int i=0;i<o.size();i++){
         em.persist(o);
         if(o.size % 100 == 0){ //equal to JDBC batch size
              em.flush();
              em.clear();
         }
    }
}

そして、これをアプリケーションコンテキストに追加してSQLステートメントを監視すると

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                           <property name="showSql" value="true"/>
        </bean>
    </property>

コンソールの結果は次のようになります

Hibernate: insert into TABLE (FIELD1, FIELD2) values (?, ?)
Hibernate: insert into TABLE (FIELD1, FIELD2) values (?, ?)
...
...
...//untill reach 100 lines.
Hibernate: insert into TABLE (FIELD1, FIELD2) values (?, ?)

私の質問はです。このメソッドを呼び出すたびに、データベースとのラウンドトリップが 100 回行われるということですか、それとも 1 回のラウンドトリップしか行われないのでしょうか。

どんな答えや洞察もいただければ幸いです。

ありがとう。

4

1 に答える 1

1

hibernate jpaでバッチ処理が必要な場合は、設定を試してください

<property name="hibernate.jdbc.batch_size" value="100" />

JPA仕様によると:

管理対象エンティティ X は、トランザクションのコミット時またはその前に、またはフラッシュ操作の結果としてデータベースに入力されます。

したがって、フラッシュはデータベースの往復です。

ところで、Spring (トランザクション) で hibernate-jpa を使用している場合、Spring がトランザクションを管理します。em.flush を呼び出す必要はありません (理想的には)

于 2012-05-08T15:42:19.423 に答える