ホームページ > データベース > mysql チュートリアル > Hibernate を使用してメモリ不足にならずに MySQL から 9,000 万件のレコードを効率的にフェッチするにはどうすればよいですか?

Hibernate を使用してメモリ不足にならずに MySQL から 9,000 万件のレコードを効率的にフェッチするにはどうすればよいですか?

DDD
リリース: 2024-12-05 13:00:11
オリジナル
593 人が閲覧しました

How Can I Efficiently Fetch 90 Million Records from MySQL Using Hibernate Without Running Out of Memory?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート