Maison >base de données >tutoriel mysql >Comment puis-je diffuser efficacement de grands ensembles de résultats MySQL au printemps pour éviter les erreurs OutOfMemoryErrors ?

Comment puis-je diffuser efficacement de grands ensembles de résultats MySQL au printemps pour éviter les erreurs OutOfMemoryErrors ?

DDD
DDDoriginal
2024-11-30 04:19:12282parcourir

How Can I Efficiently Stream Large MySQL Result Sets in Spring to Avoid OutOfMemoryErrors?

Diffuser efficacement des résultats MySQL volumineux

Dans le contexte du développement d'applications Spring, la récupération de données à partir de tables MySQL colossales peut poser un formidable défi, potentiellement menant à OutOfMemoryExceptions. En effet, le comportement par défaut du pilote MySQL JDBC consiste à charger l'intégralité du jeu de résultats en mémoire.

Définition de la taille de récupération : une mesure insuffisante

Pour atténuer ce problème , les développeurs ont souvent recours à la définition de la taille de récupération à l'aide de la méthode Statement.setFetchSize(Integer.MIN_VALUE). Toutefois, cela ne constitue pas à lui seul une solution globale. Comme indiqué dans la documentation de Statement#setFetchSize(), la taille de récupération fournit simplement une indication au pilote, qui peut ou non être honorée.

Revisite de la documentation MySQL JDBC

Une analyse plus approfondie de la documentation du pilote MySQL JDBC révèle une approche plus nuancée de la diffusion de résultats volumineux. Pour activer le streaming, une déclaration doit être créée comme suit :

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

Avertissements concernant le streaming

La mise en œuvre de cette approche s'accompagne de certaines mises en garde :

  1. Traitement des lignes : Il est crucial de traiter toutes les lignes de l'ensemble de résultats ou de le fermer rapidement. Dans le cas contraire, une exception sera levée lors de l'exécution de requêtes ultérieures sur la connexion.
  2. Achèvement de la transaction : Si l'instruction appartient à une transaction, les verrous ne seront libérés que lorsque les deux la transaction et le relevé sont terminés. Cela signifie qu'il est nécessaire de lire tous les résultats ou de fermer l'ensemble de résultats.

Repensez l'allocation de mémoire

Si vous ne définissez pas la taille de récupération et ne modifiez pas la création de l'instruction Si vous résolvez l'erreur OutOfMemoryError, la cause première peut résider dans le stockage des données dans la mémoire Java. Au lieu de mettre en cache l’intégralité du jeu de résultats, envisagez de le traiter immédiatement dès qu’il devient disponible. Cela peut nécessiter des modifications substantielles du code, impliquant potentiellement une réécriture complète.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn