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

JPA Java Discussion :

manyToMany + oneToOne + performance+LAZY


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 67
    Par défaut manyToMany + oneToOne + performance+LAZY
    bonjour
    j'ai les tables
    -USER
    -TEAM
    -USER_TEAM
    -OFFICE
    Donc une relation nn entre user et team et une relation 1 n entre team et office, ou autre formulation :.
    Un user appartient a plusieurs teams , une tean appartient a un office.

    La relation nn en jpa marche très bien et est performante en combinant un LAZY et en écrivant une jointure explicite entre USER et TEAM comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class User................
    @ManyToMany (fetch=FetchType.LAZY)
        @JoinTable(name="t_car_users_teams", 
              joinColumns = @JoinColumn( name = "id_user", referencedColumnName = "id_user"), inverseJoinColumns = @JoinColumn(name = "id_team", referencedColumnName = "id_team"))
    	private List<Team> teams;
    et pour la requete qui recupere la liste des users avec leurs teams:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select u from User u left join fetch u.teams
    Les temps de reponses sont tres bon, mais des que j'ajoute dans l'objet team le lien avec office , je constante que pour chaque team du user, jpa execute une requete pour aller chercher l'office de la team . Les perfs deviennent tres mauvaises.
    J'ai donc fait du lazy entre team et office et les perfs sont correctes mais mon objet office dans l'objet team vaut null.
    Et j'ai pas envi que les developpeurs qui utilisent l'api puissent faire par ex user.team[0].office.name et se retrouvent avec un nullPointerException.

    Donc il faut soit optimiser mais comment ?
    soit "cacher" l'accès a office dans l'objet team mais la relation entre team et office est une relation nécessaire dans d'autres contextes
    Peut être faut il faire un objet SimpleTeam sans office ?
    Bref comment faire ?

    Merci

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Par défaut
    Bonjour,

    Etrange par défaut tu aurais du avoir du lazy.

    Es tu sur que c'est un nullpointeurexception que tu choppes et non pas un lazyinitialisationException?

    As tu essayé de modifier ta requête comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select u from User u left join fetch u.teams t left join fetch t.offce

  3. #3
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 67
    Par défaut
    j'ai oublie de préciser que cette liste de user est ensuite envoyée coté client (flex). Donc la valeur null est coté client.

    Justement, des que j'ajoute le lien avec office , c'est a dire en effet "left join fetch t.offce", jpa va ,pour chaque team, chercher l'office , est donc générer un nombre faramineux de requête , d'où les performances très mauvaises.

    Pour palier a ce problème , je viens d'essayer le cache qui donne des résultats quasi instantanés . C'est a dire qu'au fur et a mesure que les teams et leur office sont chargés, il réutilise ces mêmes instance team et donc diminue considérablement le nombre de requête.
    Mieux encore, en faisant d'abord , dans la même transaction, une première requête chargeant la liste des teams (donc des offices avec), jpa ne fait plus ensuite de requête supplémentaire lors de la requête pour charger la liste des users.
    Donc en 2 requêtes, j'ai la liste des users, teams et office de chaque teams.

    Cependant,le modèle contient bien plus d'objet que user team et office.
    Donc il faudra bien a un moment donné eviter la jointure et rester en LAZY, sinon ca revient a charger toute la base. Donc il y aura bien des attributs avec comme valeur null, donc coté flex aussi. Et ca c'est pas terrible.
    Y'a -til un moyen d'éviter ce null coté client ?

    Merci

Discussions similaires

  1. Problème de Performance + lazy load
    Par valarko dans le forum Hibernate
    Réponses: 0
    Dernier message: 30/01/2012, 17h10
  2. OneToOne et Lazy loading
    Par plsavary dans le forum Hibernate
    Réponses: 4
    Dernier message: 30/04/2011, 11h51
  3. oneToOne en lazy
    Par j0hnmerrick dans le forum Hibernate
    Réponses: 1
    Dernier message: 01/07/2010, 13h38
  4. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 11h37
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 12h41

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