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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    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 : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    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
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    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 éclairé

    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 : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    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 éclairé

    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 : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    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
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    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 éclairé

    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 : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    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?

+ 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