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 :

Stratégie de chargement


Sujet :

Hibernate Java

  1. #1
    Membre régulier Avatar de yacine.dev
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Points : 88
    Points
    88
    Par défaut Stratégie de chargement
    Bonjour ,
    quelle la bonne stratégie de chargement de hibernate?
    de mettre tous les lazy=false et fetch=join dans les fichiers de mapping ça alourdis l'exécution des requêtes parce que le chargement d'un objet engendre le chargement de toutes ses associations et ainsi de suite jusqu'au charger presque tous le graphe de base de donné.Une solution c'est de charger avec setfetchMode("nom obget à joindre",fetchMode.join) c'est de laisser le chargement par défaut de hibernate(lazy=true /paresseux=oui :ne pas charger les collections et fetch=select :il ne joint pas les associations mais si les objets sont encore attaché à la session il sélectionne à la demande) .

    Merci de nous proposer une bonne stratégie

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Ça dépend complètement de ta base, et de ton besoin ... Tu imagines bien que si la possibilité de choisir existe, ce n'est pas pour rien

    Ne te prive pas d'explorer les pistes en fonction de ton besoin - ça on ne peut pas le faire à ta place. Globalement tu résumes bien le choix ; c'est lourdeur de l'appel vs lourdeur du traitement pour gérer les cas lazy. En regardant ton MCD, il est souvent assez clair de voir qu'il y a des objets dont tu as souvent besoin en association avec un premier objet, et qui ne ramènent pas toute la base avec, ceux là tu peux les charger (lazy = false), au contraire d'associations type arbre qui elles te ramèneraient toute la table associée, par exemple.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Points : 82
    Points
    82
    Par défaut
    Stratégie dépendante du contenu de la base de donnée. Par exemple, si le modèle de données est un graphe qui fait intervenir des 10 entités, la solution est bien évidement de choisir le lazy loading, on choisi les données à charger à la demande mais l'inconvénient c'est d'ajouter du code. Un connaissance approfondie du modèle de donnée est nécessaire dans ce cas.
    A l'inverse si il n'y a pas de collections dans ton modèle alors on peut envisager de charger les données. Par exemple : Un utilisateur a une adresse, on charge l'adresse en même temps qu'on charge l'utilisateur.

    En résumé c'est au cas par cas selon le modèle de donnée.
    Le manque de mémoire ( trop de données chargées ) et la montée en charge du cpu ( trop de requêtes ) sont bien évidement des signes que tout va mal
    Code Poet

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je dirais qu'il faut laisser le comportement par défaut dans les fichiers de mapping, c'est à dire, lazy à true.
    Après, selon tes besoins, tu fais les chargements à la demande via des Criteria ou des requêtes HQL.
    C'est plus souple, et au final tu auras moins de questions à te poser.

  5. #5
    Membre régulier Avatar de yacine.dev
    Inscrit en
    Octobre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Octobre 2009
    Messages : 177
    Points : 88
    Points
    88
    Par défaut
    On peut aussi mette lazy à false (si on a la plupart du temps besoin d'objet associé et dans le cas ou on ne l'est pas besoin on surcharge le mode de chargement par exemple avec criteria :setFetchmode("nom objet",fetchMode.eager).

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je précise que je pensais aux collections, qui peuvent avoir un impact significatif sur la mémoire et les performances.

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

Discussions similaires

  1. Stratégies de chargement
    Par JeReMsS69 dans le forum Hibernate
    Réponses: 30
    Dernier message: 14/05/2009, 15h31
  2. Stratégie de chargement
    Par kokumbo dans le forum Hibernate
    Réponses: 6
    Dernier message: 30/01/2008, 17h59

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