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

Hibernate でメモリ不足にならずに 9,000 万件のレコードを効率的に処理するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-03 16:34:12191ブラウズ

How Can I Efficiently Process 90 Million Records with Hibernate Without Running Out of Memory?

Hibernate の ScrollableResults を使用して 9,000 万レコードを増分的に読み取る

Hibernate の ScrollableResults インターフェイスは、結果セット全体をメモリにロードせずにクエリ結果を反復処理する手段を提供します。ただし、この質問で強調されているように、MySQL Connector/J ドライバーが使用されている場合、大量のレコードで ScrollableResults を使用するとメモリの問題が発生する可能性があります。

このような場合、唯一の実用的なオプションは結果を反復処理することです。 setFirstResult メソッドと setMaxResults メソッドを使用してバッチで実行します。このアプローチは、特に大きなオフセットを扱う場合には非効率的に見えるかもしれませんが、メモリの問題を回避する最も信頼できる方法です。

セッション レベルのキャッシュやダーティ トラッキングの問題を防ぐために、ステートレス セッションを使用するのが理想的です。 .

もう 1 つの潜在的な最適化は、id フィールドをインデックスの最後の列として使用し、クエリを変更して、インデックスの最大の ID を使用して一度にレコードのバッチを取得することです。前のバッチを開始点として使用します。これにより、クエリ内の other_condition が等価条件を使用する場合、パフォーマンスが向上します。

クエリを次のように変更することで、

select * 
from person 
where id > <max_id_of_last_batch> and <other_conditions> 
order by id asc  
limit <batch_size>

大きなオフセットのロードによって引き起こされるパフォーマンスの低下を回避し、より多くのパフォーマンスを実現できます。効率的な反復プロセス。

以上がHibernate でメモリ不足にならずに 9,000 万件のレコードを効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。