setFirstResultとsetMaxResultsを使用することが、私が知っている唯一のオプションです。
従来、スクロール可能な結果セットは、必要に応じて行をクライアントに転送するだけでした。残念ながら、MySQL Connector / Jは実際にそれを偽造し、クエリ全体を実行してクライアントに転送するため、ドライバーは実際に結果セット全体をRAMにロードし、それをドリップフィードします(メモリ不足の問題によって証明されます) 。あなたは正しい考えを持っていました、それはMySQLJavaドライバーの単なる欠点です。
これを回避する方法が見つからなかったため、通常のsetFirst/maxメソッドを使用して大きなチャンクをロードしました。悪い知らせを持ってきてすみません。
セッションレベルのキャッシュやダーティトラッキングなどがないように、必ずステートレスセッションを使用してください。
編集:
UPDATE 2は、MySQL J / Connectorから抜け出さない限り、取得するのに最適です。クエリの制限を引き上げることができない理由はありませんが。インデックスを保持するのに十分なRAMがあれば、これはやや安価な操作になるはずです。少し変更して、一度にバッチを取得し、そのバッチの最大IDを使用して次のバッチを取得します。
注:これは、 other_conditionsの場合にのみ機能します 等式を使用し(範囲条件は許可されません)、インデックスの最後の列を idにします。 。
select *
from person
where id > <max_id_of_last_batch> and <other_conditions>
order by id asc
limit <batch_size>