1

官方文档说:

批量写入可以通过在单个事务中而不是单独向数据库发送 INSERT、 UPDATE和 DELETE 语句组来提高数据库性能

(重点是我的)。

但是如果一个实体有Optimistic Locking@Version 字段,那么所有的更新都是独立执行的。

为了证明这一点,这里是源代码片段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);
}

所以,基本上,上面的代码片段意味着,如果 Entity 有一个乐观锁,那么批量更新将被忽略。

有解决方法吗?我仍然想使用 JPA。

更新
事实证明,我需要添加此属性persistence.xml以启用具有乐观锁定的批量更新:

<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.oracle.Oracle11Platform"/>  

请注意,可以使用 Oracle10Platform 或更高版本作为值。较低版本不支持此功能。

此外,要启用批量写入,您必须在 persistence.xml 中添加至少一个属性:

<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 回答