L'interface ScrollableResults d'Hibernate fournit un moyen de parcourir les résultats d'une requête sans charger l'ensemble des résultats en mémoire. Cependant, comme le souligne cette question, l'utilisation de ScrollableResults avec un grand nombre d'enregistrements peut entraîner des problèmes de mémoire si le pilote MySQL Connector/J est utilisé.
Dans de tels cas, la seule option pratique est de parcourir les résultats. par lots à l'aide des méthodes setFirstResult et setMaxResults. Bien que cette approche puisse sembler inefficace, en particulier lorsqu'il s'agit de décalages importants, elle constitue le moyen le plus fiable d'éviter les problèmes de mémoire.
Idéalement, une session sans état devrait être utilisée pour éviter tout problème de mise en cache ou de suivi incorrect au niveau de la session. .
Une autre optimisation potentielle consiste à utiliser le champ id comme dernière colonne de l'index et à modifier la requête pour récupérer un lot d'enregistrements à la fois, en utilisant l'identifiant le plus élevé du lot précédent comme point de départ. indiquer. Cela peut améliorer les performances si d'autres conditions dans la requête utilisent des conditions d'égalité.
En modifiant la requête comme suit :
select * from person where id > <max_id_of_last_batch> and <other_conditions> order by id asc limit <batch_size>
vous pouvez éviter les pertes de performances causées par le chargement de décalages importants et obtenir un résultat plus processus d'itération efficace.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!