Stratégies d'optimisation pour la lecture de grands ensembles de résultats avec Hibernate
Cet article aborde le défi de la lecture de 90 millions d'enregistrements à partir d'une base de données MySQL en utilisant Hibernate sans surcharge de la RAM.
ScrollableResults Limitations
Initialement, l'utilisateur a tenté d'utiliser ScrollableResults d'Hibernate pour diffuser les résultats de manière incrémentielle. Cependant, la bibliothèque MySQL Connector/J ne fournit pas de véritables capacités de défilement et charge l'intégralité du jeu de résultats en mémoire, ce qui entraîne une exception OutOfMemoryError.
setFirstResult/setMaxResults vs. ScrollableResults
En guise de solution de contournement, l'utilisateur a envisagé d'utiliser setFirstResult et setMaxResults pour récupérer de manière itérative des lots de résultats. Cependant, cette approche peut s'avérer inefficace, en particulier pour les grands ensembles de résultats, en raison de la surcharge liée à l'initialisation d'une nouvelle requête pour chaque lot.
Récupération de lots optimisée à l'aide de SQL natif
La solution la plus optimale suggérée par le répondant était de sortir du MySQL J/Connector et d'utiliser une requête par lots :
select * from person where id > <max_id_of_last_batch> and <other_conditions> order by id asc limit <batch_size>
Cette requête récupère un lot d'enregistrements en fonction d'un ID maximum préalablement déterminé à partir du lot précédent et les classe par ID dans l'ordre croissant. Le paramètre batch_size détermine le nombre d'enregistrements à récupérer à la fois. Cette approche garantit que seul un nombre gérable d'enregistrements est traité en mémoire, évitant ainsi l'épuisement de la mémoire.
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!