官方文档说:
批量写入可以通过在单个事务中而不是单独向数据库发送 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" />