例えば、以下の設定を行うとバッチサイズは100となります。
<properties> <property name="javax.persistence.schema-generation.database.action" value="drop-and-create" /> <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" /> <property name="javax.persistence.jdbc.url" value="url"/> <property name="javax.persistence.jdbc.user" value="user"/> <property name="javax.persistence.jdbc.password" value="password"/> <property name="hibernate.jdbc.batch_size" value="100" /> </properties>
試しに以下のコードでbatch insertの効果があるのか確認してみます。
private static void insert(EntityManager em) {
final EntityTransaction transaction = em.getTransaction();
transaction.begin();
for (int i = 1; i <= 1000; i++) {
final UserEntity entity = new UserEntity();
entity.setName("name_" + i);
em.persist(entity);
}
transaction.commit();
}
結果をみると、batch insertの効果で5倍ぐらい早くなっているのがわかります。
batch insertあり
---------- 1回目: 766ms ---------- ---------- 2回目: 390ms ---------- ---------- 3回目: 317ms ----------batch insertなし
---------- 1回目: 2369ms ---------- ---------- 2回目: 2347ms ---------- ---------- 3回目: 1589ms ----------