-
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
-
Ç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 8-)
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.
-
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 :D
-
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.
-
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).
-
Je précise que je pensais aux collections, qui peuvent avoir un impact significatif sur la mémoire et les performances.