公式ドキュメントによると:
バッチ書き込みは、INSERT、 UPDATE、およびDELETEステートメントのグループを個別にではなく単一のトランザクションでデータベースに送信することにより、データベースのパフォーマンスを向上させることができます。
(強調は私のものです)。
ただし、エンティティにOptimistic Locking
@Versionフィールドがある場合、すべてのUPDATEは独立して実行されます。
これを証明するために、ここにソースコードスニペットがありますDatabaseAccessor:566
:
if (/* ommited */(!dbCall.hasOptimisticLock() || getPlatform().canBatchWriteWithOptimisticLocking(dbCall) ) /* ommited */) {
// this will handle executing batched statements, or switching mechanisms if required
getActiveBatchWritingMechanism().appendCall(session, dbCall);
//bug 4241441: passing 1 back to avoid optimistic lock exceptions since there
// is no way to know if it succeeded on the DB at this point.
return Integer.valueOf(1);
}
したがって、基本的に、上記のスニペットが意味するのは、エンティティが楽観的なロックを持っている場合、バッチ更新は無視されるということです。
そのための回避策はありますか?まだJPAを使いたいです。
更新:楽観的ロックを使用したバッチ更新を有効にするには、
このプロパティをに追加する必要があることが判明しました。persistence.xml
<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.oracle.Oracle11Platform"/>
Oracle10Platform以降を値として使用できることに注意してください。下位バージョンはこの機能をサポートしていません。
また、バッチ書き込みを有効にするには、persistence.xmlに少なくとも1つのプロパティを追加する必要があります。
<property name="eclipselink.jdbc.batch-writing" value="JDBC" />
オプションで、バッチサイズを構成することもできます。
<property name="eclipselink.jdbc.batch-writing.size" value="1000" />