10

私のアプリケーションでは、挿入のパフォーマンスを大幅に改善する必要があります。例: 約 21K のレコードを含むファイルの挿入には 100 分以上かかります。20 分程度かかる場合もありますが、100 分を超えると時間がかかりすぎます。

データは 3 つのテーブル (多対多) に挿入されます。Id はシーケンスから生成されますが、既にグーグルで検索して設定hibernate.id.new_generator_mappings = trueし、allocationSize + シーケンスの増分を 1000 に設定しています。

また、データ量も異常ではなく、ファイルは90MB。

ほとんどの時間が jdbc ドライバー (postgresql) と休止状態に費やされていることを視覚的な vm で確認しました。この問題は、子テーブルの一意の制約に関連していると思います。サービス層は、挿入前に手動チェック (=SELECT) を行います。レコードが既に存在する場合は、制約例外を待つ代わりに再利用します。

したがって、特定のファイルについてまとめると、テーブルごとに 1 つの挿入が行われます (異なる可能性がありますが、理想的な (最速の) ケースであるこのファイルではそうではありません)。つまり、合計 60k の挿入 + 20k の選択を意味します。それでも100分以上は非常に長いようです(そうです、ハードウェアはカウントされ、7200 rpmドライブ、ssdまたはraidのない単純なPC上にあります)。ただし、これは、このハードウェアへの同じ挿入に約 15 分かかった以前のアプリケーション (プレーンな jdbc) よりも改善されたバージョンです。どちらの場合も「前処理」に約 4 ~ 5 分かかることを考えると、大幅な増加になります。

これを改善できるヒントはありますか?バッチ読み込み機能はありますか?

4

2 に答える 2

6

見る

spring-data JPA: 手動コミット トランザクションと新しいトランザクションの再起動

save() メソッドへの n 回目の呼び出しごとにentityManager.flush()andを追加します。entityManager.clear()hibernate add を使用する場合、hibernate.jdbc.batch_size=100これは合理的な選択のようです。

パフォーマンスの向上は 10 倍以上で、おそらく 100 倍近くになります。

于 2013-02-18T13:16:54.650 に答える
-1

データベースの問題のように聞こえます。テーブルがInnoDBまたはMyISAMを使用しているかどうかを確認します。後者は、私の経験では挿入が非常に遅く、新しいデータベースのデフォルトです。可能な限り外部キーを削除します

問題が本当に単一の一意のインデックスに関連している場合は、InnoDBでうまくいく可能性があります。

于 2012-11-25T08:46:10.640 に答える