save
機能をSimpleJpaRepository
からsingle record vs calling save on a list of records
に変更すると、時間が大幅に短縮されています。Spring Data JPAのsave()が単一のレコードで呼び出されたときとレコードのリストで呼び出されたときの速度が遅いのはなぜですか?
以下のループでは、list
よりも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);
私が第1のバッファに私のデータを保存したり、私ならば、それは何の違いを作るべきではありませんので、我々はこの実装SimpleJpaRepository
@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;
}
からsave
実装でちょうどマスク単一save
操作を見れば私のレコードごとに保存を呼び出すので、スピードアップは私には意味がありません。
編集: docs.spring.io/autorepo/docs/spring-data-commons/1.5.1.RELEASE/バージョンを使用します。
「SimpleJpaRepository」のサブクラスを使用していないことを確認してください。これは、 'save(Iterable)'メソッドをオーバーライドして、さらに最適化されたものですか? –
'save()'を10回呼び出した場合、10回のトランザクションを実行しますが、 'save()'を呼び出して10レコードのリストを呼び出す場合は1回だけです。それがおそらくあなたの観察の理由です。 – blafasel
JPA APIには、このような「保存」メソッドはありません。おそらく、JPA APIではない「Spring Data JPA」を意味します。 – DN1