-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 19 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: Gain de performance pour la recup via une requete hibernate
PostPosted: Wed Jul 06, 2005 10:05 am 
Newbie

Joined: Tue Jul 05, 2005 9:48 am
Posts: 15
Need help with Hibernate? Read this first:
http://www.hibernate.org/ForumMailingli ... AskForHelp

Hibernate version:3.0


Code between sessionFactory.openSession() and session.close():

public List loadList(){
List list=null;
Session session = HibernateUtil.currentSession();//Ouverture de session
Person p;
Criteria crit=session.createCriteria(Person.class);

list=crit.list();
Iterator it=list.iterator();
Set l2=new HashSet();
while(it.hasNext()){
p=(Person)it.next();
Hibernate.initialize(p.getTitlePerson());
l2=p.getActivityPerson();
Hibernate.initialize(l2);//.size();
Iterator i=l2.iterator();
while(i.hasNext()){
Hibernate.initialize(((ActivityPerson)i.next()).getCompany());
}

}

return list;

}




Bonjour tous le monde, je recherche le moyen d'accélérer la récupération de données.. Actuellement j utilise un criteria.. j voudrais savoir si y aurait po une petite astuce pour accélérer le rapatriement de objets?

Dans mon cas actuellement, j ai 800 contacts a charger d'une traite et ca prend 4 secondes dans le meilleur des cas (quand la machine est motivée... lol) mais au pire une minute... si kelk'un connait un moyen d'accélerer la requete hibernate... ( c trop long pour mon client...)

Merci d'avance...


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jul 06, 2005 3:50 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
n'utilise pas initialize, mais une requete qui charge tout en même temps
cherche HQL fetch dans la doc

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jul 07, 2005 4:40 am 
Newbie

Joined: Tue Jul 05, 2005 9:48 am
Posts: 15
Salut...
Ben g deja essayé une requete HQL pour charger mes objets en une seule fois...

bon jk explique ce k je ve chargé en une seule fois:

1 - une liste de personne dont chaque objet person contient un set d'activityPerson
2 - chaque objet activityPerson contenu dans le set
3 - chaque objet company contenu dans chaque objet activityPerson

Les 2 premiers points sont chargé avec succés grace à cette requête HQL:

String query= "from Person P1, ActivityPerson AP1 left join fetch P1.activityPerson";
mais il me lance une "LazyException" pour l'objet Company

Si j ve chargé les 3 types d'objets en même temps, j ai utilisé cette requete:

String query= "from Person P1, ActivityPerson AP1 left join fetch P1.activityPerson left join fetch AP1.company";
Mais ca ne marche po...

G chercher dans la doc anglais de Hibernate 3.x et j n'ai rien trouvé...
Est ce ke vous pourriez m'expliquer comment faire cette requete?

Est ce que le loading est plus rapide en utilisant le criteria avec un "setFetchMode=join "au lieu du HQL?


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jul 07, 2005 4:58 am 
Newbie

Joined: Tue Jul 05, 2005 9:48 am
Posts: 15
pardon g fait une erreur au niveau de la remière requête

c'est "String query= "from Person P1 left join fetch P1.activityPerson";

dsl...


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jul 07, 2005 5:09 am 
Newbie

Joined: Tue Jul 05, 2005 9:48 am
Posts: 15
Bon on vient de trouver l'erreur ...
Piur info la requete etait :

String query= "from Person P1 left join fetch P1.activityPerson AP1 left join fetch AP1.company";

mais c'est toujours aussi lent... :\

Avec un criteria muni d'un "setFetchMode=join", on obtient le même temps de loading...

J précise k on a à l'heure actuel:

791 objets Person...
734 objets ActivityPerson
531 objets Company...


Comment optimiser le temps de chargement si c'est possible?

Merci...


Top
 Profile  
 
 Post subject: idem ici
PostPosted: Mon Jul 11, 2005 5:05 am 
Newbie

Joined: Mon May 10, 2004 8:16 am
Posts: 6
J'ai le meme problème lorsque je charge bcp d'objets.
Le problème ne vient pas de la requete SQL, mais du chargemement en mémoire des objets.
Pas trouvé de solution pour le moment :(


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jul 11, 2005 12:35 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
10s voire Amin pour charger 800 objets est un temps completement irrealiste.
Le problème peut venir de beaucoup d'endroits différents (recordset enorme ramené de lz DB à cause d'un abus de left outer join, chargement d'une partie du modèle non nécessaire aka mauvais positionnement du mode lazy dans les associations, problème du n+1...)

C'est relativement difficile de trouver la cause du problème comme ça, surtout sur un forum.

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 12, 2005 3:22 am 
Newbie

Joined: Tue Jul 05, 2005 9:48 am
Posts: 15
salut emmanuel...

k est ce k t entend par mauvais positionnement du lazy.. parce ke à l'heure actuel tous les lazy sont à false...
Qu'est ce ke le pb du n +1??

merci...


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 12, 2005 4:25 am 
Newbie

Joined: Sat Jun 18, 2005 5:27 pm
Posts: 13
Normalement avec Hibernate 3, le lazy loading est par défaut à true pour les associations avec des collections ou les entités!
Ne le change pas et Utilisent plutot les "left join fetch" sur tes requêtes que
lorsque c'est nécessaire!!


Probleme n+1 :

A 1 ---- n B

On réalise une requete pour avoir A
et n requetes pour tous les B correspondant à A.

solution à ce problème: utilisation du "left join fetch" dans la requete ou bien de fetch="join" dans le fichier de mapping.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 12, 2005 4:33 am 
Newbie

Joined: Tue Jul 05, 2005 9:48 am
Posts: 15
en fait g po du saisir la notion du lazy... c koi la diff entre lazy=false et lazy=true;

j a lu la doc.; mais g po trop capté la subtilité.... ( j vais me faire tuer par l'équipe hibernate lol)
merci pour ton aide.. :)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 12, 2005 4:42 am 
Newbie

Joined: Sat Jun 18, 2005 5:27 pm
Posts: 13
lazy=true
-> les objets associés sont chargés quand on les utilise

lazy=false
-> les objets sont chargés automatiquement
(tu peux ici, jouer sur le fetch dans le fichier de mapping. fetch="join" -> 1seule requete, fetch="select" ->plusieurs requetes)


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 12, 2005 4:48 am 
Newbie

Joined: Tue Jul 05, 2005 9:48 am
Posts: 15
oui mais si j vais les charger qd j l ai utilise il fo ke l'utilisation se fasse dans une session hibernate??


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 12, 2005 5:07 am 
Newbie

Joined: Sat Jun 18, 2005 5:27 pm
Posts: 13
exactement !

La requete que tu as fais :
"from Person P1 left join fetch P1.activityPerson AP1 left join fetch AP1.company"
est pour ma part trés correcte.

Essais de tester la requete générer par HQL, directement sur PostgreSQL (j'aimerais bien connaitre son temps d'éxécution).
Regarde aussi les champs de tes tables qui sont présent dans ta requete. Tu associes peut-être des fichiers (images,...) à certains de ces champs, non ?


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 12, 2005 6:06 am 
Newbie

Joined: Tue Jul 05, 2005 9:48 am
Posts: 15
ben sous PostGreSQL c instantané.. dc d'où vient le lag... j en sais rien...
est ce k ca viendrai du temps de communication entre Gui/servlets/EjB?

ou conversion de la requete hibernate en SQL?


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 12, 2005 6:07 am 
Newbie

Joined: Tue Jul 05, 2005 9:48 am
Posts: 15
pour info ca prend 3 à 4 sec avec le lazy =true mais ce ki est bizarre c ke via PostGreSQL c instantané... zarbi cette histoire...


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 19 posts ]  Go to page 1, 2  Next

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.