-->
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.  [ 7 posts ] 
Author Message
 Post subject: Est-ce que les associations jouent sur les performances ???
PostPosted: Wed Aug 03, 2005 3:22 pm 
Regular
Regular

Joined: Sat May 15, 2004 4:27 am
Posts: 79
Bonjour,

toujours de lourds souci avec les performances de mon appli. Je souhaite
savoir une chose. Est-ce que les relations ou les associations entre les
objets peuvent avoir un impact significatif sur les performances ? Je m'
explique :

Par exemple j'ai un objet Transfert et un objet TypeTransfert. Je souhaite
que la navigabilité ne puisse se faire que du fils vers le père et pas l'inverse
soit dans notre cas de Transfert vers TypeTransfert. J'obtiens donc le
mapping suivant :

<class
name="TypeTransfert"
table="TYPE_TRANSFERT"
>
<id
name="typeTransfertId"
type="java.lang.Long"
column="type_transfert_id"
>
<generator class="sequence">
<param name="sequence">S_TYPE_TRANSFERT</param>
</generator>
</id>

<property
name="nom"
type="java.lang.String"
column="nom"
not-null="true"
length="60"
/>

<!-- Associations -->


</class>

<class name="Transfert" table="TRANSFERT">
<id
name="transfertId"
type="java.lang.Long"
column="transfert_id"
>
<generator class="sequence">
<param name="sequence">S_TRANSFERT</param>
</generator>
</id>

<property
name="priorite"
type="int"
column="priorite"
not-null="true"
length="10"
/>

<property
name="dateDemande"
type="java.util.Calendar"
column="date_demande"
not-null="true"
/>

<!-- Associations -->

<many-to-one
name="typeTransfert"
class="TypeTransfert"
>
<column name="type_transfert_id_fk" />
</many-to-one>


</class>

Je tiens à préciser que toute mon application est basé sur ce genre de
raisonnement. Je souhaite savoir si

(1) c'est une bonne pratique (ou plutot non déconseillée) ?
(2) les relations doivent elles forcément être bidirectionnelles ?
(3) la pratique que j'ai actuellement peut-elle être la source de mes
prb de performances ?

Certains vont se poser la question pourquoi je fais ça ? (lol). Je travaille
dans un projet énorme où nos architectes nous oblige à ne pas utiliser
les POJO directement mais des DTO à la place. Les POJO appartiennent
à la couche applicative la plus basse et par exemple lors de l'implémentation d'un service web le développeur ne doit voir qu'une
'image du pojo' qui est son DTO. Etant donné que l'on utilise les services
web (Axis 1.1) les Set Hibernate devient des tableaux dans les DTO.
Nous avons donc implémenter une fonction qui nous permet de passer
d'un POJO à un DTO vice versa. Afin d'un éviter les réferences circulaires
nous avons donc "casser" (comme des sauvages) les relations pour n'avoir
que des relations unidirectionnelles. Je sais ça à l'air un peu compliqué.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Aug 03, 2005 6:55 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
Si tu accedes tout le temps à blahType, cela peut être un problème.

Plusieurs solutions pour ce genre de données (dites de références) :
- les cacher (second niveau)
- ou eventuellement mettre l'association en lazy false et fetch join

PS: avoir des relations unidirectionnelles ne résout pas les pbs de references circulaires.

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Thu Aug 04, 2005 2:14 am 
Regular
Regular

Joined: Sat May 15, 2004 4:27 am
Posts: 79
Ce que j'appelle une référence circulaire c'est le fait que le parent puisse
accéder à son fils et que le fils puisse accéder à son parent. Tu sais que
ce concept nous est offert par Hibernate. La navigabilité bidirectionnelle
nous a posé pas mal de souci pour implémenter notre routine
POJO --> DTO.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Aug 04, 2005 3:05 am 
Expert
Expert

Joined: Thu Sep 04, 2003 8:23 am
Posts: 368
Nous sommes dans le même cas que toi et je je ne vois pas en quoi cela peut poser des problèmes de perf.

Les questions à se poser sont :
- Est je toujours besoin du typeTransfert quand j'accède au transfert ? Si oui faire ce que préconise emmanuel, sinon mettre du lazy entre les deux
- Souvent TypeTransfert est une classe avec peu d'instances qui bougent peu (dans mon cas), c'est le parfait candidat pour être mis en cache de second niveau
- Comment ton appli accède t'elle aux données. Si elle a fréquemment besoin de retrouver tous les transferts d'un certain type, peut être le fait de ne pas avoir le lien bidirectionnel est pénalisant.

Pour finir tu peux utiliser un outil de type irontracksql pour voir les requêtes coûteuses. Avant de revoir ton archi pour des pbs de perf, il faut être sûr que c'est bien ton archi qui est coûteuse en perf, souvent, ce n'est pas le cas.

Seb


Top
 Profile  
 
 Post subject:
PostPosted: Thu Aug 04, 2005 7:36 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
Circulaire veut dire A -> B -> C -> A et donc potentiellement duplication de A dans ton graphe
A <-> B est la forme simple de circulaire, mais on l'appelle plutot bidirectionnelle

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Mon Aug 08, 2005 4:09 am 
Regular
Regular

Joined: Sat May 15, 2004 4:27 am
Posts: 79
J'ai fait des tentatives en essayant des requêtes natives. Et sans succès. Je
commence à me poser de sérieuses questions sur mon modèle. Ai-je eu
raison de virer les relations bidirectionnelles que nous avions ?

D'autant plus que tu, scesbron, emet un commentaire que je me suis posé
moi même, est-ce que l'absence de lien bidirectionnelle peut-être pénalisant
? Au niveau où je me trouve j'essaye d'avoir des perfomrnancs 'acceptables'
avec ma config par défaut. Donc l'utilisation du cache de niveau 2 n'est pas
encore à l'orde du jour.

Merci pour vos réponses

---
Seb


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 09, 2005 9:16 am 
Regular
Regular

Joined: Sat May 15, 2004 4:27 am
Posts: 79
Je me posais des questions sur le mapping de mon appli. Et j'ai enfin les
réponses que je voulais. Mon prb de performance vient bien du mapping
que nous utilisons.

J'ai utilisé middlegen pour générer un nouveau mapping. Je tape direct
sur ma base Oracle. Je fais des petites modifs, genre lazy partout. Les
mêmes requêtes même 10 fois moins de temps avec mon nouveau map
que l'ancien. Même ma grosse requête que j'avais transformé en native
prend beaucoup moins de temps en full hibernate qu'en natif hibernate.
C'est dingue. Etant donné le constat, je vais migrer peu a peu vers le
nouveau map

Merci scesbron/emmanuel

---
Seb


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 

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.