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 :

Méthode non transactionelle avec rollback


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Points : 76
    Points
    76
    Par défaut Méthode non transactionelle avec rollback
    Bonjour,

    Je pose la question sans grande conviction mais en espérant que qqn puisse me proposer une alternative.

    Je dois importer dans une base de données un grand nombre de données.

    J'ai tout d'abord commencer logiquement à faire une méthode transactionnelle, mais cette méthode prenant énormément de temps à se réaliser, j'ai décidé d'ouvrir et de fermer ma session à chaque insertion, et là le temps d'execution est divisé par 2.

    Mon problème est si une insertion se passe mal comment revenir à l'état de départ, ou à un état stable de la base de données.

    Merci

    PS:J'utilise PostGres

  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
    C'est à toi de découper tes méthodes transactionnelles selon tes besoins.
    Si une insertion se passe mal, tu dois annuler toutes les autres, ou seulement celle qui a planté ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Points : 76
    Points
    76
    Par défaut
    Le mieux serait de faire un rollback sur toutes mes minis transactions.

  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
    Je ne vois pas trop comment faire autrement qu'une seule transaction.

    Voir ce lien pour l'insertion par paquets.

    http://www.hibernate.org/hib_docs/v3..._single/#batch

    Fais tu des flush, clear de la session régulièrement comme dans la doc ?
    Je ne sais pas si ça rendra plus rapides tes traitements, mais à défaut, tu éviteras les out of memory

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Etrange ton histoire, car tu es au sein d'une seule transaction, avec une seule session active, donc le update, flush, clear sont inutiles.
    J'y avais pensé, mais ayant vu ça sur le forum, je me suis dit que ça ne servirait à rien pour ma méthode transactionnelle, n'y a t'il pas un moyen d'accélérer une méthode transactionnelle ?

    Après je pourrais l'utiliser dans ma méthode non transactionnelle pour l'accélérer, mais ça ne résolvera pas mon problème de rollback si une des insertions se passent mal.

    En tout cas, je vais essayer de travailler avec les paquets pour éviter les dégats dans ma base de données.

    Merci bcp !

  6. #6
    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
    Envoyé par fr1man
    Etrange ton histoire, car tu es au sein d'une seule transaction, avec une seule session active, donc le update, flush, clear sont inutiles.
    Ceci n'est pas valable pour de l'insertion en masse, car la session est susceptible d'"exploser".

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 106
    Points : 76
    Points
    76
    Par défaut
    Alors je n'ai pas compris.

    Le flush et le clear peuvent avoir une utilité avec une seule session pour tout mon traitement ?

    Il y a t'il d'autres cas particuliers ?

  8. #8
    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 flush et le clear ont un intérêt lors d'insertions en masse.
    En effet, à chaque save (ou persist c'est pareil), l'objet ajouté en base est aussi ajouté à la session, et donc, si on ajoute beaucoup d'objets, la session risque d'exploser.
    Est-ce que ça a aussi un impact sur les performances, à voir, je n'en sais rien.

  9. #9
    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
    Tu peux avoir des problèmes de performances à cause du dirty checking. Hibernate scanne la session à la recherche des objets modifiés et avec beaucoup d'objets ce processus peux prendre beaucoup de temps (utiliser le FLushMode.NEVER ou Manual maintenant ???).

    La meilleure solution (et surtout la plus correcte en terme transactionnel) est bien de faire un flush + clear.

    J'ai remarqué cependant qu'avec Mysql (probablement a cause d'un réglage mémoire trop faible) le commit + clear est plus rapide, mais transactionnellement c'est faux.

    Je ne peux que te conseiller d'écrire un iterateur pour gerer le flush + clear. (Attention n'oublie pas de rattacher tes objets à la session). C'est plus pratique pour tes autres batchs et pour les autres dev.

    Pour la petite histoire certains de mes collegues n'utilisaient pas de flush + clear donc certains batchs mettaient plus d'une heure pour finir avec un flush + clear (ou commit + clear) le batch ne mettait plus que 2 minutes pour finir. Avec un iterateur mes collegues n'ont plus de questions à se poser.

Discussions similaires

  1. Une méthode @WS REST avec un PUT non fonctionnel
    Par geforce dans le forum REST
    Réponses: 0
    Dernier message: 27/10/2014, 15h08
  2. UpCasting non respecté avec une méthode surchargée
    Par Nicolas Dansel dans le forum Langage
    Réponses: 9
    Dernier message: 27/05/2009, 14h46
  3. [Affectation] Méthode des Hongrois avec une matrice non carrée
    Par bmw13fr dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 12/09/2007, 14h38
  4. Méthode d'affichage avec MFC
    Par Blobette dans le forum MFC
    Réponses: 2
    Dernier message: 09/03/2005, 16h48
  5. Réponses: 4
    Dernier message: 07/12/2002, 15h24

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