1

persist()エンティティ オブジェクトを作成し、Hibernate を JPA プロバイダーとして使用して呼び出して、データベースにデータを入力しようとしています。

最初は、データベースは空です。次に、エンティティ インスタンス (100,000 インスタンス) をループで作成し、それぞれを永続化します。

この操作では、すべてのエンティティをデータベースに挿入するのに 10 分ほどかかります。私は無料のタイヤ アマゾン クラウド サーバー マシン、600 MB の RAM メモリを使用しています。

ループは次のようなものです。

@Transactional
void populateDataBase()
{
    for(int i=0; i<100000; i++)
    {
        MyEntityPK entityInstancePK = new MyEntityPK(idfield1, idField2, idField3);

        MyEntity entityInstance = new MyEntity();

        entityInstance.setId(entityInstancePK);

        entityInstance.setField1(integerValue);
        entityInstance.setField2(integerValue);

        entityInstance.persist();
    }
}

この行にコメントを付けるpersist()と、ループは数秒で終了します。行のコメントを外すentityInstance.persist();と、ループが完了するまでに 10 分ほどかかります。

この操作は時間とメモリを消費しますか? またはそれは速くあるべきではありませんか?この場合、persist() の代わりに merge() を呼び出す方が良いですか? たぶんもっと速いですか?

4

1 に答える 1

3

ええ、あなたはバッチ処理に関するドキュメントをチェックする必要があります。

あなたはもっと好きなことをしたい

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}
于 2012-08-10T13:38:07.797 に答える