批量写入可以通过发送组来提高数据库性能 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" />
答案 0 :(得分:1)
您是否检查了正在使用的平台类的canBatchWriteWithOptimisticLocking()方法?此调用是这样的,如果您的驱动程序可以支持返回批处理中各个调用的行计数,以便Eclipselink可以根据需要抛出乐观锁定异常,则可以使用批处理。