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