例えば、以下の設定を行うとバッチサイズは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 ----------