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 3] Questions générales sur les performances


Sujet :

Hibernate Java

  1. #1
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut [Hibernate 3] Questions générales sur les performances
    Salut,

    Je débute avec hibernate, j'ai déjà bien avancé mais je me heurte a des problèmes (je sépare en plusieurs posts).

    Hibernate ne précharge rien et fait toutes ces opérations à chaque opération (load, saveOrUpdate, delete etc...). Je vois les requêtes en show_sql=true qui passent pour chaque opération (comme ci-dessous)

    J’ai tenté de mettre lazy=false et fetch=join puis fetch=select sur toutes mes relations one-to-many
    => out of memory error ^^


    Avec la méthode join, il tente de faire une requête assez grosse sur 10 tables
    Avec la méthode select il tente de des milliers de select

    Dans tous les cas, ma base fait pas plus de 80Mo, j’ai du mal à comprendre pourquoi mon pc est monté a 1.3 Go de mémoire occupé…


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <set name="characterses" inverse="true"  lazy="false" fetch="join" cascade="all-delete-orphan">
                <key>
                    <column name="account_name" length="45">
                        <comment></comment>
                    </column>
                </key>
                <one-to-many class="net.sf.l2j.loginserver.beans.Characters" />
            </set>
    Quelles sont les meilleures stratégies de chargement de données ?
    Est-ce que hibernate est bien capable comme je l’avais cru de garder les données dans un cache mémoire ?
    C’est quoi les caches de hibernate et a quoi correspondent-ils ? Premier niveau, second niveau etc… ?

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    sauf que la jvm est limité par défaut à 64M de mémoire donc forcément essayer de faire tenir 80M dedans ça fait boum. Tu peux changer cette valeur par défaut en utilisant l'option -Xmx de la commande java.

    Mais en amont de ça, faire du lazy=false sur du one-to-many est à prescrire, c'est comme celà que tu te retrouves à instancier toute la base en mémoire (voire plus).

    Le lazy loading permet justement d'éviter ce genre de problèmes, en laissant la possibilité au dev de récupérer et instancier les données nécessaires au moment voulu et pas avant.

    le lazy=false peut être utile quand tu as des relations one-to-one

  3. #3
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    Oui j'avais changé a 512, mais ca a quand même dépassé.

    Pour le lazy=false, je comprends. Mais si justement je veux un cache sur toutes les données qui ne changeront pas. Ici c'est pas un bon exemple puisque les comptes et utilisateurs peuvent changer, mais dans le cas d'un référentiel statique, j'ai éventuellement envie de tout charger.
    Cependant ca semble très consommateur.

    Auparavant, en jdbc, il était fait des select sur chaque table, c'était monté en mémoire (souvent des map). La navigation entre objets liés se faisaient donc par les clés des map. Ca consommait en mémoire, c'est sur, mais pas autant que le test que je viens de tenter avec une dizaine de tables. J'ai donc du louper un truc.

  4. #4
    BsT
    BsT est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Points : 83
    Points
    83
    Par défaut
    Comme le precise Sinok il faut que tu mettes lazy=true sur les collections, sinon tu vas tout charger en mémoire alors tu n'en as pas forcement besoin.

    De plus je te recommande d'ajouter dans le mapping de tes classes lazy=true
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <class lazy="true"></class>
    cela permet de charger les classes à la demande (regarde bien la doc hibernate sur ce point).

    Sans ses ajouts, lorsque tu chargeras un objet depuis la base tu n'executeras pas 1 select, mais une infinité (ie : tu vas monté la base en mémoire).

    Les différents caches :

    Cache de la session : Ce cache a de multiples roles. Je ne considére pas ce cache comme un cache (super lol . C'est une structure qui permet (pour l'objet session) d'effectuer le dirty-checking, de garantir l'unicité d'une instance d'objet (ie : tu n'as qu'un objet Character d'id 1), de gerer les cycles dans ton arborescence d'objet, de faire des controles de cohérences sur les objets que tu manipules et quand meme d'éviter de faire trop de requetes quand tu demandes 10 fois le meme objet . Edit : Une chose etonnante c'est que l'on remarque que le cache de la session provoque une forte consommation mémoire, mais qu'en réalité il permet d'économiser la mémoire

    Cache de second level : Cache de données ...

  5. #5
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    Ok, je vois.

    Mais imaginons (j'insiste je sais ^^) que je veuille charger un référentiel en mémoire, dans ce cas, quelle est la meilleure méthode de chargement ? En effet, dans mon cas, la vitesse d'execution est importante, plus que la consommation mémoire.

    La doc parle de chargement par join ou select. Dans les deux cas c'est assez lourd à gérer pour la base de données.

    Comment spécifier à hibernate de charger des collections au démarrage ?

    Dans mon exemple, Hibernate n'a rien chargé au démarrage (j'aurais préféré) mais a tenté de charger toutes mes relations lors du premier accès à account.
    Plutot que d'avoir 1 seul select qui récupère tous les objets liés (donc ingérable pour ma base) ou 1 select par élément de ma table account, hibernate n'est-il pas capable de charger chaque collection séparément puis de reconstruire les liens en mémoire ensuite ?

  6. #6
    BsT
    BsT est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Points : 83
    Points
    83
    Par défaut
    Hibernate.initialize(obj) ?

    j'utilise J2EE donc on a une initialisation au démarrage du serveur...

    Sinon le problèmatique que j'ai rencontré qui se rapproche le plus de toi c'est les listes d'affichages qui se résout avec un bon select champs1, champ2 .... avec
    session.createQuery().list();

  7. #7
    Membre régulier
    Profil pro
    Abcde
    Inscrit en
    Août 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Abcde
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2004
    Messages : 59
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par hugo123
    Ok, je vois.

    Mais imaginons (j'insiste je sais ^^) que je veuille charger un référentiel en mémoire, dans ce cas, quelle est la meilleure méthode de chargement ? En effet, dans mon cas, la vitesse d'execution est importante, plus que la consommation mémoire.

    La doc parle de chargement par join ou select. Dans les deux cas c'est assez lourd à gérer pour la base de données.

    Comment spécifier à hibernate de charger des collections au démarrage ?

    Dans mon exemple, Hibernate n'a rien chargé au démarrage (j'aurais préféré) mais a tenté de charger toutes mes relations lors du premier accès à account.
    Plutot que d'avoir 1 seul select qui récupère tous les objets liés (donc ingérable pour ma base) ou 1 select par élément de ma table account, hibernate n'est-il pas capable de charger chaque collection séparément puis de reconstruire les liens en mémoire ensuite ?

    Il faut regler ca avec le cache de 2nd niveau (ehcache par défaut) pour gerer les caches mémoires d'objets et de requetes, tout est dans la doc, tout est configurable et puissant.

    pour les chargements de collection, tu peux preciser comment tu veux charger cela (lazy et fetch dans les mappings ou alors directement dans les requetes HQL).

    @+

  8. #8
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    Ok, bon ben je vais tester tout ca et je ferais un retour.

    Merci.

Discussions similaires

  1. question générale sur les librairies
    Par adiiii dans le forum C++
    Réponses: 0
    Dernier message: 11/07/2008, 14h48
  2. Questions générales sur les services NT
    Par scougirou dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 16/03/2007, 16h50
  3. Question générales sur les IG en Java
    Par link182 dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 18/02/2006, 12h42
  4. question générale sur les conteneurs
    Par tut dans le forum C++
    Réponses: 6
    Dernier message: 01/09/2004, 11h11
  5. Question générale sur les affectations ?
    Par Clemaster dans le forum C++
    Réponses: 5
    Dernier message: 09/08/2004, 18h03

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