如果实体具有乐观锁定,则EclipseLink批处理更新不起作用

时间:2012-11-14 11:23:51

标签: jpa-2.0 eclipselink

Official documentation说:

  

批量写入可以通过发送组来提高数据库性能   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中添加至少一个属性:

<property name="eclipselink.jdbc.batch-writing" value="JDBC" />  

您也可以选择配置批量大小:

<property name="eclipselink.jdbc.batch-writing.size" value="1000" />

1 个答案:

答案 0 :(得分:1)

您是否检查了正在使用的平台类的canBatchWriteWithOptimisticLocking()方法?此调用是这样的,如果您的驱动程序可以支持返回批处理中各个调用的行计数,以便Eclipselink可以根据需要抛出乐观锁定异常,则可以使用批处理。