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 :

Hibernate et problèmes de mémoire


Sujet :

Hibernate Java

  1. #1
    Membre éclairé Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Par défaut Hibernate et problèmes de mémoire
    Salut,

    Je suis entrain de développer une application web en utilisant Hibenate pour accéder à la base de données.

    Le problème que je viens de rencontrer, c'est que au bout d'un certain temps, l'exception java.lang.OutOfMemoryError se génère à cause de la persistance: toutes les données de la BD se charge dans la mémoire.

    Y a-t-il un moyen pour ne charger certaines tables (surtout pour les relations père fils).

    Si vous avez des suggestions ou des remarque merci de me les indiquer.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Chaque objet que tu récupere de la BD est sauvegardé dans la Session hibernate donc faut faire des:session.clear() surtout si tu es dans une boucle apres un CRUD.

  3. #3
    Membre éclairé Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Par défaut
    Merci pour la réponse.

    En fait j'ai certains objet que je veux garder dans les sessions du serveur web, par contre y en a d'autres dont le nombre peut atteindre des centaines de milliers que je ne veut pas charger dans la mémoire.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu peux utiliser session.evict(objet) si tu veux faire un traitement plus spécialisé...
    Le graphe complet d'objets est obligatoire ?
    Tu passes par du lazy loading ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Par défaut
    J'ai pas besoin de charger le graph complet.
    comment faire avec le "lazy"?

    Merci

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je te propose de lire ceci pour le lazy loading.
    En fonction de la version d'hibernate, le défaut peut changer.
    En v2, lazy=false, en v3, lazy=true.

    Maintenant, si tu charges un graphe d'objets en mémoire, tu peux à tout moment le libérer via session.evict.
    Si tu utilises un cache de 2ème niveau, c'est au niveau de la factory qu'il faut jouer.
    Exemple de la doc Hibernate
    sessionFactory.evict(Cat.class, catId); //evict a particular Cat
    sessionFactory.evict(Cat.class); //evict all Cats
    sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
    sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    mauvais plan de garder des objets hibernate dans la session serveur. En tout cas, si tu garde la session hibernate concernée ouverte. Les session hibernate ne sont pas threadsafe et intégrées à tes objets (hibernate les dérive pour y injecter la session) -> Faut protéger tous les accès à tes objets. Il vaut mieux faire une architecture un session par requete http, avec un cache de second niveau en place, ca ne surcharge pas la DB et reste performant.

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    mauvais plan de garder des objets hibernate dans la session serveur.
    Ça c'est clair... du moins pour une application web (ce qui est le cas)...
    Personnellement, je fais également une session le temps du request/response (quitte à utiliser un filtre rien que pour libérer la session en fin de cycle), ça me paraît être la meilleure pratique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je rajoute qu'a un époque, on a développé une application inter ici, qui travaillais avec une session / utilisateur, afin de pouvoir garder des objets hibernate en session scope. Au final ça a été tellement galère qu'on a tout migré pour du request scope. quitte à garder quelques objets hibernate détachés en session scope, mais sans la session hibernate Le cache de second niveau fait vraiment un bon boulot pour éviter de surcharger de requete la DB (pas qu'elle serait lente à répondre, mais on perdrait en latence réseau)

  10. #10
    Membre éclairé Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Par défaut
    Merci pour la réponse.

    En fait il y a des choses dont vous avez parlé, et qui me paraissent importante comme la protéction de l'accès aux objets et le filtre.
    Avez vous des documents ou des liens qui expliquent bien ces notions.

    Merci d'avance.

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pour la protection, c'est la même que tu mettrais en java pour n'importe quelle donnée partagée qui doit n'être accédée que par une personne à la fois, il faut un verrou, des blocs synchronisés, ce qui implique dans un serveur web des pertes de performance assez élevées.

    Pour la doc hibernante avec la session, recherche "session per request pattern hibernate" dans google, t'aura la doc, en anglais.

Discussions similaires

  1. [GWT + Hibernate + GWTExt] Probléme d'espace mémoire.
    Par squall23 dans le forum GWT et Vaadin
    Réponses: 5
    Dernier message: 03/12/2008, 12h01
  2. [Hibernate][Oracle] Problème de rapidité
    Par Saloucious dans le forum Hibernate
    Réponses: 7
    Dernier message: 27/11/2008, 11h00
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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