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 : Problemes de transactions [Débutant(e)]


Sujet :

Hibernate Java

  1. #1
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut Hibernate : Problemes de transactions
    Salut les gars,
    je fais mes grands débuts sur Hibernate et je bute sur un problème. J'ai un fichier log de 76289 lignes à parser et les résultats je les mets dans une BDD.

    Mon problème se situe au niveau des transactions. Quand je parse mon fichier avec les transactions (session.beginTransaction() au debut et session.getTransaction.commit() à la fin), je mets les elts dans une JavaBean et je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    session.save(bean) ou session.persist(bean)
    Sauf que l'opération met un temps fou pour pour récupérer les données et les mettre dans la base (> 15 mn) à tel point que je suis obligé d'arreter l'exécution. Quand je parse mon fichier sans transactions, ca se fait en quelques secondes et ne met rien dans la BDD.
    Quand je fais cette pte requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    List<Stat> ls = session.createQuery("Select * from Stat").list();
    this.log.warn(ls.size());
    Dans le premier cas, ca me renvoie rien puisque je suis obligé d'arreter l'exécution tandis que dans le deuxième cas, ca me renvoie 0.

    J'ai essayé un petit astuce. J'ai initialisé un compteur à 25 et j'ai remarqué que les données sont effectivement insérées dans la base avec les transactions et ca m'affiche 25.



    J'espère que je me suis fait comprendre dans mes explications. N'hésitez pas à me demander de clarifier certains points si je ne suis pas clair.










    P.S: En passant, c'est quoi la différence entre la methode persist et save?

  2. #2
    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
    Regarde du côté du traitement par paquet dans la doc :
    http://www.hibernate.org/hib_docs/v3..._single/#batch

    Si tu insères beaucoup de données, il vaut mieux les écrire au fur et à mesure dans la base, ça devrait améliorer les performances.

  3. #3
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Merki pour ta réponse, je vais jeter un coup d'oeil.
    Mais, en gros c'est quoi la différence si je sauvegarde mon objet avec la methode persist ou save?

  4. #4
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Merci encore une fois pour le lien.
    Je viens de l'essayer et j'ai suivi l'explication qu'ils ont donné à savoir de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    session.flush();
    session.clear();
    après après avoir inséré un certain nombre d'eléments dans la base. Mais à la fin, ca me fait une grosse exception : java.lang.OutOfMemoryError: Java heap space.

    Comme je te l'ai dit, mon fichier de log est super long. Est ce que tu pourrais me m'indiquer une méthode pour insérer sans problème les éléments dans la table?
    Est ce que en passant, je dois activer le cache d'Hibernate?

    Je te montre l'erreur généree :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    	at java.util.Hashtable.rehash(Hashtable.java:358)
    	at java.util.Hashtable.put(Hashtable.java:414)
    	at sun.text.resources.DateFormatZoneData.loadLookup(DateFormatZoneData.java:148)
    	at sun.text.resources.DateFormatZoneData.handleGetObject(DateFormatZoneData.java:73)
    	at java.util.ResourceBundle.getObject(ResourceBundle.java:319)
    	at java.text.DateFormatSymbols.initializeData(DateFormatSymbols.java:491)
    	at java.text.DateFormatSymbols.<init>(DateFormatSymbols.java:103)
    	at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:445)
    	at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:427)
    	at org.hibernate.type.DateType.toString(DateType.java:78)
    	at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:172)
    	at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154)
    	at org.hibernate.type.AbstractType.hydrate(AbstractType.java:81)
    	at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2101)
    	at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1380)
    	at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1308)
    	at org.hibernate.loader.Loader.getRow(Loader.java:1206)
    	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580)
    	at org.hibernate.loader.Loader.doQuery(Loader.java:701)
    	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    	at org.hibernate.loader.Loader.doList(Loader.java:2213)
    	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    	at org.hibernate.loader.Loader.list(Loader.java:2099)
    	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    	at fr.upmc.ent.portalstats.dao.hsql.StatDAOHibernate.parse(StatDAOHibernate.java:110)
    	at fr.upmc.ent.portalstats.test.TestEtape4.action(TestEtape4.java:51)
    	at fr.upmc.ent.portalstats.test.TestEtape4.main(TestEtape4.java:70)


    Merci pour ta réponse !

  5. #5
    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
    Le persist est là pour se mettre en accord avec la norme JPA.
    Il fait la même chose que le save sauf qu'il ne retourne rien, au contraire du save
    qui retourne l'id de l'objet créé.
    A vérifier dans la doc.

    Pour ton problème, c'est justement que tu mets trop de choses dans la session
    et du coup, elle explose. Quand on insère beaucoup de données, il faut faire des flushs et des clear réguliers de la session pour éviter ça, comme c'est expliqué dans le lien que je t'ai donné.

  6. #6
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Pour ton problème, c'est justement que tu mets trop de choses dans la session
    et du coup, elle explose. Quand on insère beaucoup de données, il faut faire des flushs et des clear réguliers de la session pour éviter ça, comme c'est expliqué dans le lien que je t'ai donné.
    En fait, je fais un flush et un clear à chaque fois que j'insere 20 elts dans la base.
    C'est un problème ca?

  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
    Ce sont 20 éléments en tout, ou 20 éléments de premier niveau, avec d'autres objets associés ?

  8. #8
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Qu'est ce que tu entends par 20 elts de 1er niveau?
    Ce que je fais, je récupère mes données dans mon fichier de log et je crée mon javaBean que j'insère directement dans la base. Après avoir inséré 20 elts, je flush et je clear et je recommence ;

  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
    Je pense à des objets qui possèdent des liens vers d'autres objets, via des collections.

    Ils sont gros ces objets que tu insères ?

  10. #10
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Non, ce sont de simples objets qui n'ont aucune référence vers d'autres objets ou collections. Mes objets contiennent des champs avec les types basiques de java (string,int, date) particulièrement avec leurs getters et setters.

  11. #11
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    si on regarde le message d'erreur, ce serait pas plutôt au moment où il récupère sa liste d'objets que ça plante ?

    si tu veux savoir le nombre d'objets, utilise select count(*), et si tu tiens à tout récupérer quand même, essaies la methode query.scroll()
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  12. #12
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Salut les mecs et ca marche.
    En fait, le problème est que je lançais la JVM avec les paramètres par défaut 40M et 256M. J'ai changé les paramètres en lancant eclipse avec 256M et 300M.
    Et là ca marche.
    Je vous remercie qd meme pour vos explications

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

Discussions similaires

  1. [Hibernate] Problemes de connexion d'un sous domaine
    Par sylvain_neus dans le forum Hibernate
    Réponses: 15
    Dernier message: 09/05/2006, 10h49
  2. [hibernate] probleme à la compilation sous eclipse
    Par ejaub dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/11/2005, 10h45
  3. [Hibernate] Problème de sauvegarde
    Par lilou77 dans le forum Hibernate
    Réponses: 15
    Dernier message: 26/10/2005, 11h17
  4. [Hibernate] Problème de clé composite
    Par esteban dans le forum Hibernate
    Réponses: 3
    Dernier message: 01/09/2005, 17h12
  5. [Hibernate]Probleme de requete avec un "or"[\Hiber
    Par crips dans le forum Hibernate
    Réponses: 5
    Dernier message: 07/07/2005, 03h28

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