Maison >base de données >tutoriel mysql >Comment diffuser efficacement de grands ensembles de résultats MySQL au printemps sans erreurs OutOfMemory ?

Comment diffuser efficacement de grands ensembles de résultats MySQL au printemps sans erreurs OutOfMemory ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-02 01:17:12807parcourir

How to Efficiently Stream Large MySQL Result Sets in Spring Without OutOfMemory Errors?

Diffusion en continu de grands ensembles de résultats MySQL

Description du problème

Lors du chargement de grandes tables MySQL dans un Application Spring, des exceptions OutOfMemory se produisent en raison des tentatives du pilote de charger la table entière en mémoire. Malgré la définition de la taille de récupération sur Integer.MIN_VALUE, la fermeture de ResultSets entraîne des problèmes de blocage. Le blocage persiste même pour les petites tables et empêche la fermeture de la connexion, ce qui entraîne la trace de pile suivante :

[Stack trace of the hang inserted here]

Solution

La définition de la taille de récupération uniquement est insuffisante. Le pilote MySQL JDBC nécessite une méthode de création d'instruction spécifique :

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

Précautions et implications

Cette approche comporte plusieurs mises en garde :

  • Toutes les lignes de l'ensemble de résultats doivent être lues avant que d'autres requêtes puissent être exécutées.
  • Les verrous ne sont libérés qu'après la transaction. ou l'instruction est terminée, ou l'ensemble de résultats actif est fermé.

Considérations supplémentaires

Si l'exception OutOfMemory persiste, envisagez de mettre en œuvre un traitement immédiat des données extraites de la base de données pour éviter une allocation de mémoire excessive. Cela peut nécessiter une restructuration importante du code et une approche différente du contrôle de flux.

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