Brug af setFirstResult og setMaxResults er din eneste mulighed, som jeg er klar over.
Traditionelt ville et rulbart resultatsæt kun overføre rækker til klienten efter behov. Desværre forfalsker MySQL Connector/J den, den udfører hele forespørgslen og transporterer den til klienten, så driveren faktisk har hele resultatsættet indlæst i RAM og vil dryppeføde det til dig (vist af dine manglende hukommelsesproblemer) . Du havde den rigtige idé, det er bare mangler i MySQL java-driveren.
Jeg fandt ingen måde at komme uden om dette, så gik med at indlæse store bidder ved at bruge de almindelige setFirst/max-metoder. Beklager at være bringer af dårlige nyheder.
Bare sørg for at bruge en statsløs session, så der ikke er nogen cache på sessionsniveau eller beskidt sporing osv.
EDIT:
Din OPDATERING 2 er den bedste, du får, medmindre du bryder ud af MySQL J/Connector. Selvom der ikke er nogen grund til, at du ikke kan øge grænsen for forespørgslen. Forudsat at du har nok RAM til at holde indekset, burde dette være en noget billig operation. Jeg ville ændre det lidt og tage en batch ad gangen og bruge den højeste id for den batch til at få fat i den næste batch.
Bemærk:dette virker kun hvis other_conditions brug lighed (ingen områdebetingelser tilladt) og hav den sidste kolonne i indekset som id .
select *
from person
where id > <max_id_of_last_batch> and <other_conditions>
order by id asc
limit <batch_size>