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 :

hibernate : utliser query.list() ou query.iterate()


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 36
    Par défaut hibernate : utliser query.list() ou query.iterate()
    bonjour mes amis,
    j'ai une application web en spring+hibernate+struts. et tout marche trés bien. Mais aprés le déploiment en qlq jours un bug me sort le message : java.lang.OutOfMemoryError.
    aprés une recherche sur internet j'ai trouvé deux astuces :
    - augmenter la mémoire allouée par la JVM
    - optimiser le code en libérant de objets non utilisé pour quels soit supprimer par le Garbage Collector.
    pour la deuxième solution, j'ai examiner le code et j'ai remaque que toutes les requête HQL sont enoyée par le bais d'une méthode qui retourne query.list();.
    donc une liste qui a toutes les objets souhaité à afficher... et je trouve ça non optimal (et si on a 1000000 objets. c'est la panique de la RAM)
    ma question :
    - y a t'elle une différence entre query.list() et query.iterate() dans le sens d'optimisation de la mémoire allouée ?
    merci d'avance

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    C'est à toi de faire une requête suffisamment précise pour ne pas récupérer autant de lignes en une seul fois.
    Tu peux également utiliser un système de pagination.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 36
    Par défaut
    Merci pour votre réponse,
    la requête est composée dynamiquement par des critère de recherche définit par l'utilisateur de l'application. autant de plus j'utilise la pagination pour limiter le nbre des lignes à afficher. Mais pour faire cela je devrais stocker tous les objets résultat dans Arraylist en affectant par query.list().
    mais si je fais ça avec l'iterator (qurey.iterate()) ça devra résoudre le problème de la mémoire ?

  4. #4
    Membre expérimenté Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Attention, l'utilisation de query.iterate() peut considérablement allonger ton temps de traitement (car soumis au syndrome du N+1 select).
    A priori l'utilisation d'itération "scrollable" (ScrollableResults) si ton driver JDBC le tolère serait plus performant.
    Pour plus d'infos, voir la doc d'Hibernate (paragraphes 10.4.1 si Hibernate v3+).

  5. #5
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 36
    Par défaut
    Merci bien pour votre réponse (une nouvelle piste à creuser )
    seulement une dernière question : est ce que le drivers JDBC d'oracle support "ScrollableResults" ?
    merci

  6. #6
    Membre expérimenté Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Je n'en sais rien. Il faudrait tester en activant les traces SQL pour voir :
    1/ si ça marche (il est possible qu'une exception soit levée si ce n'est pas supporté par le driver.
    2/ comment ça se passe en terme d'ordres SQL.
    Bon courage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. cacti pas de data query liste vide
    Par hacbao dans le forum Supervision
    Réponses: 1
    Dernier message: 22/05/2014, 09h06
  2. Réponses: 2
    Dernier message: 13/05/2009, 13h43
  3. [forms 6i] liste + ENTER-QUERY
    Par Magnus dans le forum Oracle
    Réponses: 3
    Dernier message: 23/12/2005, 14h30
  4. [dev-C++]std::list<tree_node<T>*> iterator;
    Par jmv dans le forum Dev-C++
    Réponses: 7
    Dernier message: 06/05/2005, 13h14
  5. faire un Query sur un Query ?
    Par davestar dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2004, 12h30

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