私のアプリケーションでは、挿入のパフォーマンスを大幅に改善する必要があります。例: 約 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 分かかることを考えると、大幅な増加になります。
これを改善できるヒントはありますか?バッチ読み込み機能はありますか?