1

公式ドキュメントによると:

バッチ書き込みは、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" />
4

1 に答える 1

1

使用しているプラ​​ットフォーム クラスの canBatchWriteWithOptimisticLocking() メソッドを確認しましたか? この呼び出しは、必要に応じて Eclipselink がオプティミスティック ロック例外をスローできるように、ドライバーがバッチ内の個々の呼び出しの行数を返すことをサポートできる場合に、バッチ処理を使用できるようにするためのものです。

于 2012-11-14T14:05:39.290 に答える