Hibernate を使用して大規模な結果セットを読み取るための最適化戦略
この記事では、Hibernate を使用せずに Hibernate を使用して MySQL データベースから 9,000 万件のレコードを読み取るという課題について説明します。 RAM をオーバーロードしています。
ScrollableResults制限事項
当初、ユーザーは Hibernate の ScrollableResults を利用して結果を段階的にストリーミングしようとしました。ただし、MySQL Connector/J ライブラリは真のスクロール機能を提供せず、結果セット全体をメモリにロードするため、OutOfMemoryError 例外が発生します。
setFirstResult/setMaxResults と ScrollableResults
回避策として、ユーザーは setFirstResult と setMaxResults を使用して、バッチを繰り返しフェッチすることを検討しました。 結果。ただし、このアプローチは、バッチごとに新しいクエリを初期化するオーバーヘッドのため、特に大規模な結果セットの場合、非効率的になる可能性があります。
ネイティブ SQL を使用した最適化されたバッチ取得
回答者が提案した最も最適な解決策は、MySQL J/Connector を抜け出し、バッチ処理を使用することでした。 query:
select * from person where id > <max_id_of_last_batch> and <other_conditions> order by id asc limit <batch_size>
このクエリは、前のバッチから事前に決定された最大 ID に基づいてレコードのバッチを取得し、それらを ID で昇順に並べます。 batch_size パラメータは、一度に取得するレコードの数を決定します。このアプローチにより、管理可能な数のレコードのみがメモリ内で処理されるようになり、メモリの枯渇が防止されます。
以上がHibernate を使用してメモリ不足にならずに MySQL から 9,000 万件のレコードを効率的にフェッチするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。