Java 为什么选择Spring数据JPA';s save()在单个记录上调用时比在记录列表上调用时慢?
在Java 为什么选择Spring数据JPA';s save()在单个记录上调用时比在记录列表上调用时慢?,java,transactions,spring-data-jpa,spring-transactions,Java,Transactions,Spring Data Jpa,Spring Transactions,在单个记录上使用SimpleJpaRepository中的save功能与在记录列表上调用save相比,我的时间大大缩短了 下面的循环比列表花费的时间长10倍 for (Record r : csvRecords) { myRepository.save(r); } myRepository根本没有任何@Transactional注释。 但与上面的循环相比,下面的循环速度非常快 List<Record> myArray = new ArrayL
单个记录上使用SimpleJpaRepository
中的save
功能与在记录列表上调用save相比,我的时间大大缩短了
下面的循环比列表花费的时间长10倍
for (Record r : csvRecords) {
myRepository.save(r);
}
myRepository
根本没有任何@Transactional
注释。
但与上面的循环相比,下面的循环速度非常快
List<Record> myArray = new ArrayList();
for (Record r : csvRecords) {
myArray.add(r);
}
myRepository.save(myArray);
这个实现只是屏蔽了单个save
操作,因此,如果我首先将数据存储在缓冲区中,或者对每个记录调用save,则不会有任何区别,因此速度的提高对我来说没有任何意义
编辑:
使用版本。如果是单个分录,您将打开10个需要打开和关闭的交易;在列表
的情况下,save(singleEntry)
(在saveAll
中使用)将重复使用已经打开的事务,因此它是一个打开和关闭的事务。顺便说一句,如果我正确地重新调用它的saveAll(Iterable)
而不是save(Iterable)
你确定你没有使用simpleparepository
的子类,该子类会用更优化的方法覆盖save(Iterable)
方法吗?如果对save()
进行10次单次调用,则执行10次事务,但如果使用10条记录的列表调用save()
,则只执行一次。这可能就是你观察的原因。JPAAPI没有这样的“保存”方法。也许你的意思是“Spring数据JPA”,它不是JPA API。@DN1谢谢你的评论。谢谢你指出它!显然我用的是旧版本。@Oleg啊!这是有道理的。
@Transactional
public <S extends T> List<S> save(Iterable<S> entities) {
List<S> result = new ArrayList<S>();
if (entities == null) {
return result;
}
for (S entity : entities) {
result.add(save(entity));
}
return result;
}