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 :

Problème de performance d'Hibernate


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Problème de performance d'Hibernate

    Bonjour tout le monde,
    Je suis un nouvel utilisateur d'Hibernate et j'ai fait une application qui l'utilise pour la couche persistance.
    Mon probleme est le suivant :
    L'application bug sans aucun message d'erreur dans les logs, lorsque je fait appel plusieurs fois a : getSessionFactory().getCurrentSession().saveOrUpdate(myObject);

    Si l'appel se fait moins que 3000 fois , il y a aucun problème les insert marche super bien sur la DB... Mais si je fait 10000 appels elle commence a ralentir jusqu’à l’arrêt.

    Je pense que c'est un problème de performances , alors quelqu'un peux me suggérer quelque chose ??

  2. #2
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    10.000 appel = 10.000 bean en mémoire. Suivant la taille de ces beans, la mémoire consommée peut effectivement être assez imposante. Si les insertion sont indépendantes, regardez à commiter et fermer la session toutes les 500 valeurs, par exemple, histoire que la mémoire occupée par ces beans puisse être libérée. Le ralentissement d'un application java est souvent due à une diminition significative de l'espace libre, ce qui force le garbage collector à faire de plus en plus souvent des full gc pour libérer de moins en moins de mémoire. Jusqu'à atteindre le OutOfMemoryError.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut re
    Merci tchize, mais le problème est que c'est spring avec son transaction manager qui gère les transactions automatiquement. J'ai deja penser a commiter mannuelement mais cela deviens impossible avec le transaction-manager.
    Tu saurais pas comment le configurer ??

  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
    Si tu cherches à insérer de grandes quantités de données, regarde le chapitre sur le traitement par lots.
    http://docs.jboss.org/hibernate/core..._single/#batch

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    J'ai deja le traitement par lot, et impossible de le mettre en oeuvre car c'est pas moi qui gere les transaction, ie : je ne peux pas écrire cela :
    tx.commit();
    session.close();

  6. #6
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    affichez le code de votre traitement par lot. La doc de fr1man devrait empecher toute explosion de la mémoire.

  7. #7
    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
    Dommage de ne pas avoir pris le temps de consulter le lien, tu y aurais trouvé ce bout de code qui explique la façon de procéder:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for ( int i=0; i<100000; i++ ) {
        Customer customer = new Customer(.....);
        session.save(customer);
        if ( i % 20 == 0 ) { //20, same as the JDBC batch size
            //flush a batch of inserts and release memory:
            session.flush();
            session.clear();
        }
    }
    Je te recommande d'aller quand même voir la documentation pour les explications.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    j'ai lu ! j'ai tester cette méthode d'ajout depuis une semaine mais cela n'est pas possible car le seule a gérer les transaction c le TRANSACTION-MANAGER de spring ie : c'est lui qui s'occupe des commit ..... du moment ou il y a une annontation @Transitional devant la méthode

  9. #9
    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
    Alors tu as mal lu !
    Ne fais pas de commit, tu fais simplement, des flush() et clear(), pour vider la session.
    Laisse Spring gérer tes transactions.

    Le commit de l'exemple, est là, parce que Spring n'est pas utilisé et qu'il faut bien gérer malgré tout les transactions.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    C'est réglé,
    PS : je fait pas de flush et clear car spring gère cela automatiquement lorsqu'il effectue un commit.
    la solution consistait a bien savoir ou mettre l’annotation @Transactional, car c'est a la fin de cette méthode qu'intervient spring... qui lui meme fait un flush et un clear apres un commit.
    Et moi mon @Transactional été a la fin de la boucle :S donc c'est normal qu'il y'aie le bug.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Merci Pour votre aide, je suis stagiaire ingénieur informatique et j’interviens pour ajouter des fonctionnalités et corriger les bugs d'une appli. en faisant une nouvelle fonctionnalité, j'ai rencontré ce problème.

  12. #12
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par badino Voir le message
    C'est réglé,
    PS : je fait pas de flush et clear car spring gère cela automatiquement lorsqu'il effectue un commit.
    Alors, tôt ou tard, votre problème reviendra. Avec plus de données. Il y a pas de mal à appeler flush et clear, ca n'a rien à voir avec la transaction.

    PS: on peux mettre un @transactional sur une boucle?

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Non je me suis pas bien exprimé, c'est devant la méthode qui contient la boucle que j'ai fait @Transactional

    @Transactional
    public void maMethode(List<Elements>){
    fot (int i=0;i<list.size();i++){
    .
    .
    .

    }
    }

    Maintenant, pour chaque element de la liste il y a une méthode qui est appelée et qui effectue pleins de traitements et des saveOrUpdate();
    c'est devant cette méthode qui est devenur @Transactional

  14. #14
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    bref t'as résolu le problème de "10.000 objets en mémoire, ca encombre" en le convertissant en un problème "10.000 transactions, elle va souffrir la DB".

    Pas vraiment la solution à recommander, mais si ça marche pour toi....

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Oui, t'as raison, faudrai penser a une meilleur solution. Mais le but été deja que je résou le bug, et que je commence a me familiariser avec spring-hibernate.
    En tout cas, je vous remercie tout les deux, car rien qu'en échangeant avec vous m'était constructif car je travail seul et isolé

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/11/2009, 14h54
  2. Problème de performance Hibernate/Oracle
    Par gozzs dans le forum Hibernate
    Réponses: 1
    Dernier message: 04/06/2009, 15h52
  3. [JPA/Hibernate] Problème de performance
    Par Baptiste Wicht dans le forum JPA
    Réponses: 5
    Dernier message: 30/04/2009, 20h48
  4. Réponses: 8
    Dernier message: 21/11/2006, 11h54
  5. [Hibernate][Ibatis] Problème de performance..
    Par Saloucious dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/10/2005, 13h21

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