Maison >base de données >tutoriel mysql >Comment puis-je diffuser efficacement des ensembles de résultats volumineux à partir de MySQL pour éviter les erreurs OutOfMemoryErrors ?

Comment puis-je diffuser efficacement des ensembles de résultats volumineux à partir de MySQL pour éviter les erreurs OutOfMemoryErrors ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-27 08:14:11648parcourir

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

Diffusion en continu de grands ensembles de résultats à partir de MySQL

Récupérer de grands ensembles de résultats à partir de MySQL peut être difficile, surtout si la mémoire de l'application est limitée. Ce problème est souvent rencontré lorsque le pilote JDBC tente de charger la table entière en mémoire, ce qui entraîne une exception OutOfMemoryException.

Utilisation de setFetchSize()

Une solution courante à ce problème Le problème est d'utiliser la méthode setFetchSize() pour limiter le nombre de lignes extraites de la base de données. Cependant, cette approche seule n'est pas toujours suffisante, car le pilote MySQL JDBC nécessite des paramètres supplémentaires pour activer le streaming.

Création d'une instruction en avant seule et en lecture seule

Pour activer le streaming des jeux de résultats dans MySQL, une instruction doit être créée avec les paramètres suivants :

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

Définition de la récupération Size

Une fois l'instruction créée, la méthode setFetchSize() doit être utilisée pour indiquer au pilote que de grands ensembles de résultats peuvent être récupérés :

stmt.setFetchSize(Integer.MIN_VALUE);

Mises en garde concernant le streaming

Il est important d'être conscient des limites et des mises en garde du résultat set streaming :

  • L'ensemble des résultats doit être lu ou fermé avant d'émettre toute autre requête sur la même connexion.
  • Des problèmes de verrouillage peuvent survenir si l'instruction est utilisée dans une transaction. Les verrous ne sont libérés que lorsque la transaction est terminée ou que tous les résultats en attente sont lus ou que l'ensemble de résultats est fermé.

Considérations supplémentaires

Si l'erreur OutOfMemoryError persiste malgré l'utilisation les paramètres ci-dessus, cela peut indiquer que l'application ne traite pas les données immédiatement dès qu'elles deviennent disponibles. Cela nécessite de restructurer le code pour traiter les données de manière incrémentielle afin d'éviter de conserver l'ensemble des résultats en 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!

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