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

Hibernate Java Discussion :

Chargement de grande quantité de donnée avec hibernate


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 153
    Par défaut Chargement de grande quantité de donnée avec hibernate
    Bonjour,
    je me trouve confronté à une situation de OutOfMemoryError. le fait est que j'essai de charger une table qui contient 128000 enregistrement provenant d'une base de données postgres. via cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List result=null ; 
             result = session.createCriteria("MaClasse").list()
    le problème est qu'au bout de 15min (temps que trouve extrèmement long, j'ai une erreur OutOfMemoryError) .
    le heap de ma JVM est paramétré a une taille max de 515M, et lorsque j'évalue, chaque objet des 128000 renvoyé par postgres, j'ai une taille d'environ 48 octect ce qui théoriquement ferrait 6 144 000 octets donc un peu plus de 6M.
    arrêtez-moi si je me trompe.
    la session hibernate constitue le cache d'objet. avec un ejb statefull, c'est le serveur qui crée et détruit la session à chaque requête (donc le cache doit être vidé par le GC)
    pourquoi ais-je cette erreur? alors que les données que je charge ont une très faible taille?

  2. #2
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Je connais pas super bien hibernate et tout son bordel de cache mais il y a un truc qui peut t'être utile avec les grosses requêtes:

    Par défaut, le driver JDBC de postgres cache localement tous les résultats de ta requête (tes 128k lignes) avant de donner la main au code qui fait l'itération du resultset.
    Ca veut dire que tu peux déjà gagner pas mal si tu spécifies un setFetchSize par exemple de 1000, quasiment presque diviser par 2 le pic mémoire.

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par mysianne Voir le message
    lorsque j'évalue, chaque objet des 128000 renvoyé par postgres, j'ai une taille d'environ 48 octect ce qui théoriquement ferrait 6 144 000 octets donc un peu plus de 6M.
    arrêtez-moi si je me trompe.
    On peux voir ton objet, je serais plutot pour une évaluation minimuml de 120 /150 octets par instance créée, mais il faut voir l'objet pour plus de détails.

    Aussi, pourquoi avoir besoin de ces 128.000 objets en mémoire?

    A noter que tu peux utiliser setFirstResult et setMaxResult sur l'instance de criteria pour paginer tes données.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 153
    Par défaut
    Merci vous avez bien raisons. ce n'est pas du tout normal de vouloir garder un aussi grand nombre d'objet en mémoire. j'ai fait un tes dans une application java simple en essayant d'instancier ces 128000 objets, après plus de 25min, l'opération n'était pas toujours terminer.
    En effet, ce test avait pour but de m'aider à apprécier le temps de chargement d'une grande quantité de données. que je vais utiliser dans mon appli pour faire des calculs (sur chaque instance). mais je crois que la solution est de passer par une procédure stockée dans postgres pour faire tous les calculs et de restituer l'ensemble des résultat en jouant avec setFirstResult et setMaxResult.

Discussions similaires

  1. Problème de chargement des données avec hibernate
    Par nasnet dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 02/07/2013, 17h46
  2. [Core] Apprendre à traiter des quantités importantes de données avec Hibernate
    Par Mickael Baron dans le forum Hibernate
    Réponses: 0
    Dernier message: 17/05/2012, 11h39
  3. Réponses: 1
    Dernier message: 14/02/2007, 10h48
  4. Réponses: 1
    Dernier message: 10/01/2007, 15h52
  5. dao mette à jour de grandes quantités de données
    Par random dans le forum Contribuez
    Réponses: 8
    Dernier message: 14/06/2006, 20h25

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