IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

OutOfMemoryError lors d'un select sur une grande table


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    lr
    lr est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Par défaut OutOfMemoryError lors d'un select sur une grande table
    Salut,

    Je dois récupérer les données d'une table qui contient plusieurs centaines de milliers de lignes afin de générer des rapports.

    Le problème c'est que j'obtiens systématiquement des OutOfMemoryError.

    Comment traîter ce problème ?

    J'ai essayé ça mais ça ne change rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PreparedStatement statement = connection.prepareStatement( query, ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY );
    statement.setFetchSize( 1000 );
    ResultSet resultSet = statement.executeQuery();
    Merci d'avance
    Lilian

  2. #2
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    à mon avis le problème mémoire ne vient pas de la requete mais du stockage des résultats ...

    tu as mis un paramètre relatif à la mémoire pour le lancement (xms, xmx ?). Dans le cas contraire la mémoire utilisée pas java est 64 Mo je crois, donc si tu peux en mettre plus ...

  3. #3
    lr
    lr est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Par défaut
    Citation Envoyé par in
    à mon avis le problème mémoire ne vient pas de la requete mais du stockage des résultats ...

    tu as mis un paramètre relatif à la mémoire pour le lancement (xms, xmx ?). Dans le cas contraire la mémoire utilisée pas java est 64 Mo je crois, donc si tu peux en mettre plus ...
    Merci pour ta réponse,

    Effectivement ça vient du stockage en mémoire du résultat du select. En tout cas c'est mon impression.

    Mais je doute que la solution soit d'augmenter la mémoire alloué à la VM car cette mémoire n'est pas infinie alors que le nombre de lignes de ma table...

    Il me faudrait une vraie solution, je pourrais faire de la pagination en ajoutant des LIMIT et OFFSET à ma requête mais je préfèrerais éviter, je me dis que ça doit être une problématique classique et qu'il doit y avoir des solutions...

  4. #4
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    a mon avis si tu veux vraiment stocker "plusieurs centaines de milliers de lignes" en mémoire, il va falloir l'augmenter. Ya rien de choquant.

    Ensuite comment stockes tu ces données (arbre, liste ordonnée ....) ça peut jouer pas mal. Ainsi que ce que représente une ligne ... si t'as des blob et des gros textes, c'est pas gagné.

    Si tu ne veux pas augmenter la mémoire, tu n'as pas d'autre solution que de traiter morceaux par morceaux.

    Y'a pas d'autre solution je pense. Et pour moi c'est une "vraie" solution
    Qu'est ce que ce serait pour toi une "vraie" solution ?

  5. #5
    lr
    lr est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 338
    Par défaut
    Je ne souhaite pas particulièrement les stocker en mémoire, j'ai juste besoin de pouvoir faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    statement.executeQuery()
    puis des

    etc.

    Avec ça je génère des PDF que j'écris sur le disque, je ne devrais pas avoir à tout stocker.

    Mais je ne sais pas comment c'est implémenté dans java.sql, donc je ne sais pas si tout le résultat de la requête est stocké ou si les données sont récupérées au fur et à mesure que j'avance mon curseur avec next().

    Je suis en train d'essayer en paginant en ajoutant des LIMIT et OFFSET à ma requête mais j'ai l'impression que je ne devrais pas avoir à faire ça

  6. #6
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Citation Envoyé par lr
    Mais je ne sais pas comment c'est implémenté dans java.sql, donc je ne sais pas si tout le résultat de la requête est stocké ou si les données sont récupérées au fur et à mesure que j'avance mon curseur avec next().
    en fait tout n'est pas rapatrié d'un coup. Tu as une fetchsize qui est définie. Elle indique le nombre de lignes rapatriées par le ResultSet. Lors de l'appel à next sur la dernière ligne, il te rapatrie les suivantes. Tu peux essayer de le baisser pour voir si c'est mieux, ça va réduire la taille de l'objet ResultSet en mémoire.

    Ton problème de mémoire vient peut être de la création du fichier pdf ? as tu essayer d'utiliser un outil de profilage pour suivre l'évolution de la conso mémoire ?

Discussions similaires

  1. Multiple SELECT sur une même TABLE
    Par anto2b dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/08/2012, 10h24
  2. Delete sur une grande table
    Par lordMehdi dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2012, 16h59
  3. Accès pour SELECT sur une seule table
    Par jgfa9 dans le forum Administration
    Réponses: 2
    Dernier message: 02/09/2009, 18h52
  4. Optimisation d'une requête SELECT sur une grosse table
    Par eracius dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/05/2008, 14h51
  5. pb d'insertion avec un SELECT sur une autre table
    Par epeichette dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 22h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo