2017-11-24 5 views
3

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.RELEA‌​SE/バージョンを使用します。

+0

「SimpleJpaRepository」のサブクラスを使用していないことを確認してください。これは、 'save(Iterable)'メソッドをオーバーライドして、さらに最適化されたものですか? –

+1

'save()'を10回呼び出した場合、10回のトランザクションを実行しますが、 'save()'を呼び出して10レコードのリストを呼び出す場合は1回だけです。それがおそらくあなたの観察の理由です。 – blafasel

+1

JPA APIには、このような「保存」メソッドはありません。おそらく、JPA APIではない「Spring Data JPA」を意味します。 – DN1

答えて

3

1つのエントリの場合は、10個のトランザクションをオープンしています。 ListsaveAllの内部で使用されている)save(singleEntry)の場合は、すでに開いているトランザクションを再利用するため、1つのトランザクションを開いて閉じます。そして私が正しく電話をかけると、btw saveAll(Iterable)ではなく、save(Iterable)です。

+0

それを指摘してくれてありがとう!明らかに古いバージョンを使用しました。 – Oleg

+0

@Olegああ!それは理にかなっている。 – Eugene

関連する問題