大量のデータを挿入する際のHibernateのパフォーマンスの問題

natuslaedo

大量のデータ(単一タイプのエンティティ)をAmazonのDynamoDBからMySQLDBに移行します。Hibernateを使用して、このクラスをmysqlエンティティにマップしています。300万のエンティティがあります(リストプロパティの行を除く)クラスマッピングの概要は次のとおりです。

@Entity
@Table(name = "CUSTOMER")
public class Customer {
    @Id
    @Column(name = "id")
    private String id;

    //Other properties in which all of them are primitive types/String

    @ElementCollection
    @CollectionTable(name = "CUSTOMER_USER", joinColumns = @JoinColumn(name = "customer_id"))
    @Column(name = "userId")
    private List<String> users;

    // CONSTRUCTORS, GETTERS, SETTERS, etc.
}

usersは文字列のリストです。次のような2つのmysqlテーブルを作成しました。

CREATE TABLE CUSTOMER(id VARCHAR(100), PRIMARY KEY(id));
CREATE TABLE CUSTOMER_USER(customer_id VARCHAR(100), userId VARCHAR(100), PRIMARY KEY(customer_id, userId), FOREIGN KEY (customer_id) REFERENCES CUSTOMER(id));

注: hibernateにID値を生成させることはありません。一意であることが保証されている、お客様のエンティティにIDを割り当てています。

これがhibernate.cfg.xmlです:

<hibernate-configuration>    
    <session-factory>    
    <property name="hibernate.dialect">   org.hibernate.dialect.MySQLDialect </property>    
    <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property>  
    <property name="hibernate.connection.url"> jdbc:mysql://localhost/xxx </property>    
    <property name="hibernate.connection.username"> xxx </property>    
    <property name="hibernate.connection.password"> xxx </property>
    <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
    <property name="hibernate.jdbc.batch_size"> 50 </property>
    <property name="hibernate.cache.use_second_level_cache">false</property>
    <property name="c3p0.min_size">30</property>
    <property name="c3p0.max_size">70</property>
    </session-factory> 
</hibernate-configuration>

それぞれがDynamoからデータを読み取り、Hibernateを介してMySQlDBに挿入するスレッドをいくつか作成しています。各スレッドの機能は次のとおりです。

// Each single thread brings resultItems from DynamoDB
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
for(int i = 0; i < resultItems.size(); i++) {
    Customer cust = new Customer(resultItems.get(i));
    session.save(cust);
    if(i % BATCH_SIZE == 0) {
        session.flush();
        session.clear();
    }
}
tx.commit();
session.close();

独自のパフォーマンス監視機能があり、全体的な読み取り/書き込みパフォーマンスを継続的にログに記録しています。問題は、移行は(平均で)1500アイテム/秒の読み取り/書き込みから始まりますが、CUSTOMERテーブルとCUSTOMER_USERテーブルの行数が増える限り(数分後、r / w速度は約500アイテム/)遅くなり続けます。秒)。私はHibernateの経験がありません。ここに、私の質問があります。

  1. 私たちのようなマルチスレッドタスクの場合、hibernate.cfg.xmlはどのようになりますか?私が上で与えた内容はそのようなタスクに適していますか、それとも間違った/欠けている点がありますか?
  2. 正確に50のスレッドがあり、それぞれが次のことを行います。最初にDynamoDBから読み取り、次に結果をmysql dbに挿入し、次にdynamoから読み取ります。したがって、Hibernateとの通信の稼働時間は100%ではありません。このような状況で、c3p0接続プールサイズのmin_sizeとmax_sizeを設定することをお勧めしますか?概念を理解できるようにするには、hibernate.cfg.xmlに残りのc3p0関連のタグも設定する必要がありますか?
  3. 一括挿入の速度を最大化するために何ができるでしょうか?

注1ユーザーのリスト以外の残りのプロパティはすべてint、boolean、Stringなどであるため、すべてのプロパティを記述しませんでした。

注2すべてのポイントがテストされており、パフォーマンスに悪影響を与えることはありません。mysql dbに何も挿入しない場合、読み取り速度は何時間も安定しています。

3mysqlテーブルの構造、構成設定、セッション/トランザクション、接続プールの数、バッチサイズなどに関する推奨事項/ガイダンスは非常に役立ちます。

hemant1900

これらの2つのテーブルにデータを挿入する以外に、Hibernateトランザクションで何もしていないと仮定するとStatelessSession session = sessionFactory.openStatelessSession();、通常のセッションの代わりに使用して、キャッシュを維持するオーバーヘッドを減らすことができますただし、ネストされたコレクションオブジェクトを個別に保存する必要があります。https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.htmlを参照してください

だからそれは次のようなものかもしれません-

// Each single thread brings resultItems from DynamoDB
StatelessSession session = factory.openStatelessSession();
Transaction tx = session.beginTransaction();
for(int i = 0; i < resultItems.size(); i++) {
    Customer cust = new Customer(resultItems.get(i));   
    Long id = session.save(cust); // get the generated id
    // TODO: Create a list of related customer users and assign the id to all of them and then save those customer user objects in the same transaction.  
    if(i % BATCH_SIZE == 0) {
        session.flush();
        session.clear();
    }
}
tx.commit();
session.close();

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

WPFは、大量のデータに関するパフォーマンスの問題を制御します

分類Dev

phpmyadminデータベースにhtmlフォームデータを挿入する際の問題

分類Dev

大量のデータに対するListViewおよびCursorAdapterのパフォーマンスの問題

分類Dev

Dynamics 365 CustomerEngagementで監査データを取得する際のパフォーマンスの問題

分類Dev

Elastic SearchNestを使用したデータ挿入のパフォーマンスの問題

分類Dev

XAMLを作成する際のVisualStudioのパフォーマンスの問題

分類Dev

XAMLを作成する際のVisualStudioのパフォーマンスの問題

分類Dev

大量のデータを持つ休止挿入のパフォーマンスを向上するための最良の方法

分類Dev

パフォーマンステストの実行時にプロファイルを挿入する際の問題

分類Dev

IQueryable.First()を実行する際のパフォーマンスの問題

分類Dev

ビューページャーのrecyclerviewに大きなデータをロードする際のパフォーマンスの問題

分類Dev

入力タイプの色とvモデルに関するVueのパフォーマンスの問題

分類Dev

入力タイプの色とvモデルに関するVueのパフォーマンスの問題

分類Dev

pysparkで階層順に行を取得する際のデータフレームのパフォーマンスの問題

分類Dev

データベースからIDを挿入する際の問題

分類Dev

Oracleテーブルのレコードを更新する際のEntityFrameworkのパフォーマンスの問題

分類Dev

NASAデータから地形をレンダリングする際のOpenglのパフォーマンスの問題

分類Dev

ビッグデータを挿入するためのSQLServerのパフォーマンスの向上

分類Dev

Dockerコンテナでデータベースを実行する際のパフォーマンスの問題

分類Dev

EFObjectContextでの一括挿入のパフォーマンスの問題

分類Dev

RecyclerViewの画像をダウンロードする際のパフォーマンスの問題

分類Dev

DICOMデータをセル配列に読み込む際のパフォーマンスの問題

分類Dev

UITableViewCellで画像をぼかす際のパフォーマンスの問題

分類Dev

BaseX:ノードの挿入パフォーマンスの問題

分類Dev

副選択でn個の最新の行を選択する際のパフォーマンスの問題

分類Dev

ngForを使用して新しい入力を挿入する際のフォーカスの問題

分類Dev

大量のデータに対するnvd3のパフォーマンス

分類Dev

Regd:ODACを介してOracleサーバーに接続する際のパフォーマンスの問題

分類Dev

挿入を伴う大きなテーブルでのmysqlのパフォーマンスの問題

Related 関連記事

  1. 1

    WPFは、大量のデータに関するパフォーマンスの問題を制御します

  2. 2

    phpmyadminデータベースにhtmlフォームデータを挿入する際の問題

  3. 3

    大量のデータに対するListViewおよびCursorAdapterのパフォーマンスの問題

  4. 4

    Dynamics 365 CustomerEngagementで監査データを取得する際のパフォーマンスの問題

  5. 5

    Elastic SearchNestを使用したデータ挿入のパフォーマンスの問題

  6. 6

    XAMLを作成する際のVisualStudioのパフォーマンスの問題

  7. 7

    XAMLを作成する際のVisualStudioのパフォーマンスの問題

  8. 8

    大量のデータを持つ休止挿入のパフォーマンスを向上するための最良の方法

  9. 9

    パフォーマンステストの実行時にプロファイルを挿入する際の問題

  10. 10

    IQueryable.First()を実行する際のパフォーマンスの問題

  11. 11

    ビューページャーのrecyclerviewに大きなデータをロードする際のパフォーマンスの問題

  12. 12

    入力タイプの色とvモデルに関するVueのパフォーマンスの問題

  13. 13

    入力タイプの色とvモデルに関するVueのパフォーマンスの問題

  14. 14

    pysparkで階層順に行を取得する際のデータフレームのパフォーマンスの問題

  15. 15

    データベースからIDを挿入する際の問題

  16. 16

    Oracleテーブルのレコードを更新する際のEntityFrameworkのパフォーマンスの問題

  17. 17

    NASAデータから地形をレンダリングする際のOpenglのパフォーマンスの問題

  18. 18

    ビッグデータを挿入するためのSQLServerのパフォーマンスの向上

  19. 19

    Dockerコンテナでデータベースを実行する際のパフォーマンスの問題

  20. 20

    EFObjectContextでの一括挿入のパフォーマンスの問題

  21. 21

    RecyclerViewの画像をダウンロードする際のパフォーマンスの問題

  22. 22

    DICOMデータをセル配列に読み込む際のパフォーマンスの問題

  23. 23

    UITableViewCellで画像をぼかす際のパフォーマンスの問題

  24. 24

    BaseX:ノードの挿入パフォーマンスの問題

  25. 25

    副選択でn個の最新の行を選択する際のパフォーマンスの問題

  26. 26

    ngForを使用して新しい入力を挿入する際のフォーカスの問題

  27. 27

    大量のデータに対するnvd3のパフォーマンス

  28. 28

    Regd:ODACを介してOracleサーバーに接続する際のパフォーマンスの問題

  29. 29

    挿入を伴う大きなテーブルでのmysqlのパフォーマンスの問題

ホットタグ

アーカイブ