2017-02-15 10 views
2

私はDBに多くのテストデータを入力しようとしていますので、CommandLineRunnerを書いて約2k個のエンティティを保存しました。spring boot jpa - テストデータを生成して保存する

それは仕事ですが、終わりまでには(5-10分)かかります - これは間違ったやり方ですか?

@Component 
public class DbSeederTest implements CommandLineRunner { 

    @Autowired 
    FirstRepo firstRepo; 
    @Autowired 
    SecondRepo secondRepo; 
    @Autowired 
    ThirdRepo thirdRepo; 

    private List<FirstEnt> firstList = new ArrayList<>(); 
    private List<SecondEnt> secondList = new ArrayList<>(); 
    private List<ThirdEnt> thirdList = new ArrayList<>(); 


    private void generateTestData() { 
      // generate alot of entities, and add them to the Lists 
    } 

    @Override 
    public void run(String... args) throws Exception { 

     System.out.println("saving ents..."); 

     generateTestData(); 

     try { 

      firstRepo.save(firstList); 
      secondRepo.save(secondList); 
      thirdRepo.save(thirdList); 

     } catch(Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 
+0

私はなぜその時間がかかりすぎるのか分かりませんが、スレッドコンセプトを使用することで確実に時間を短縮できます。 'generateTestData();'の後にデータがすでに設定されているので、今度は別のスレッドですべてのrepo saveメソッドを呼び出します。 – SachinSarawgi

答えて

0

バルク挿入機能を試してみることができます。

<property name="jdbc.batch_size">250</property> 

をこのバッチを使用すると、のような出力が必要設定:

insert into Table(id , name) values (1, 'na1') , (2, 'na2') ,(3, 'na3').

あなたはHibernateのSessionFactoryの特性の一つとして定義することができます休止状態プロパティがあります。代わりにあなたのリポジトリに

insert into Table(id , name) values (1, 'na1'); 
insert into Table(id , name) values (2, 'na2'); 
insert into Table(id , name) values (3, 'na3'); 

あなたの周りの250を永続化することになるメソッドを保存するエンティティ...(あなたはあなたのアプリケーションにスイートスポットに性能面でどのようないくつかのテストをしなければならない)、その後、あなたをフラッシュしますすべてのデータが保存されるまで最高のパフォーマンスが得られるようにセッションを設定してください:

public void save(List<Item> itemList){ 
    for (int i=0; i<itemList.size(); i++) { 
     session.save(itemList.get(i)); 

     if (i % 250 == 0) { //250, same as the JDBC batch size 
      //flush a batch of inserts and release memory: 
      session.flush(); 
      session.clear(); 
     } 
    } 
} 
0

スレッディングコンセプトの使用時間を短縮することができます。すべてのsaveメソッドを呼び出す前に

あなたがgenerateTestData();を呼び出した後、データを持っているレポ。

だからあなたのコードを少しはThread runメソッドは次のようにあなたは、Java 7でこれを行うことができますJavaの8の機能を使用して上書きされ

Thread thread1 = new Thread(()->firstRepo.save(firstList)); 
Thread thread2 = new Thread(()->secondRepo.save(secondList)); 
Thread thread3 = new Thread(()->thirdRepo.save(thirdList)); 
thread1.start(); 
thread2.start(); 
thread3.start(); 
を変更:

Thread thread1 = new Thread(new Runnable() { 

    @Override 
    public void run() { 
     firstRepo.save(firstList); 

    } 
}); 

は、この情報がお役に立てば幸いです。

関連する問題