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

Spring Java Discussion :

Spring + Hibernate + JTA


Sujet :

Spring Java

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Par défaut Spring + Hibernate + JTA
    Bonjour @ tous,

    J'utilise Spring Hibernate dans un contexte JTA.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <bean id="myEmf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    	<property name="persistenceUnitName" value="myPersistenceUnit" />
    </bean>
    <bean id="myTxManager"
    	class="org.springframework.orm.jpa.JpaTransactionManager">
    	<property name="entityManagerFactory" ref="myEmf" />
    </bean>
    <tx:annotation-driven transaction-manager="myTxManager" />
    Le cas classique :
    Lors de l'utilisation de @Transactional
    Un begin est effectué au début de la méthode
    Un commit est effectué à la sortie de la méthode
    Tout ca est transparent et trés bien géré par Aop

    Par contre comment forcer le commit lors d'un traitement de gros volume de données.
    En effet si au bout du 10000eme éléments, une exception est levée ( sur une contrainte d'intégrité par ex)
    -> alors l'exception est remontée et le rollback sera effectué sur l'ensemble des eléments.

    Il semble que si l'on utilise JTA on ne puisse pas agir de manière programmatique sur les transactions.
    Comment faire ?

    Ps:
    1/
    J'ai testé au travers d'un catch de trapper l'exception et d'utiliser l'option
    @Transactional(noRollbackFor="monexception")
    Le Roolback est toujours effectif
    2/
    J'ai tenter de "piloter" la transaction em.getTransaction().commit();
    Pas le droit !!

    Merci pour vos remarques.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29
    Par défaut
    tu peux pas fonctionner de manière de batch?

    de facon a splitter tes 10000 en packet de 1000?

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Par défaut
    Effectivement c'est une solution que j'ai envisagé.
    Mais cela reste assez sale
    J'aimerai bien trouver une solution afin de pouvoir "reprendre la main" sur la transaction en cas de nécessité.
    Mais peut être que dans un contexte JTA cela impose de ne pas pouvoir intervenir sur les transactions. -> Alors je trouverai ça assez réducteur

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29
    Par défaut
    je sais pas si tu pourras intervenir sur la dite txn...

    cfr sqlloader de oracle qui permet ce genre de chose, je pense pas qu'une solution de ce type le permette pr le moment :s

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Par défaut
    Quelqu'un aurait une autre idée ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Par défaut
    Pourquoi tu ne peux pas utiliser un TransactionCallback et un TransactionTemplate? Mais le plus simple reste effectivement de faire des transactions déclaratives, avec @Transactionnal.
    Sinon je ne comprends pas pourquoi tu dis qu'avec JTA on ne peut pas agir programmatiquement sur les transaction?
    Et sinon on a toujours Spring Batch pour faire des batchs :-)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Par défaut
    Merci pour ta réponse
    Effectivement en mode BMT il est tout a fait possible de gérer les transactions de manière programmatique,
    mais j'ai oublié de préciser que je souhaitai travailler dans un contexte CMT et en utilisant des transactions déclaratives par annotation ( @Transactionnal )

    Connais tu le moyen dans ce contexte de forcer des begin rollback commit ?
    (ex : pour des cas de traitement de gros volume de données et se prendre une exception puis un rollback au 10000eme enregistrement -> )
    Alors que par essence c'est le container qui fais le Job, c'est peut être quelque chose de pas permis dans ce contexte .

    Merci

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Par défaut
    Bonjour, tu fais une analogie aux BMT et CMT, tu n'utilises pas vraiment ça? Sinon tu vas effectivement avoir des soucis avec tes @Transactionnal...

    A nouveau, 2 solutions :
    - Soit tu fais des @Transactionnal, dans ce cas tu as un bean "gestionnaire" qui lance des traitements dans un autre bean, qui lui a les @Transactionnal et fait des boucles de 1000 enregistrements. Attention à ne pas faire cela dans le même bean, avec les proxy Spring AOP si tu fais un this.mamethod() le @Transactionnal ne sera pas pris en compte...
    - Soit tu fait un TransactionTemplate. C'est un peu compliqué mais ça marche bien aussi

    Sinon, je te conseille à nouveau de regarder Spring Batch, c'est fait pour ça.

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Par défaut
    Merci pour ta réponse
    effectivement je vais utiliser @transactionnal dans un contexte CMT.
    1/
    effectivement je me heurte a la gestion des transactions ( si je veux maitriser les transactions de manière fine je ne suis pas dans le bon mode !)
    2/
    Initialement j'ai mis en oeuvre la premiere solution ( je croyais qu'il y avait mieux c'est pour cela que j'ai posté)
    Je suis tombé évidemment dans "le piège" du this.mamethod ( il faut une 1ere fois)
    par contre je vais "fouiller" ta deuxième solution.
    Puis Spring Batch
    Merci pour ton aide

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Par défaut
    Désolé pour toi, je croyais que c'était juste une analogie! Faire des @Transactionnal ou bien du batch avec des EJBs, bon courage! Les deux sont possibles, mais à l'utilisation on sent bien que ça n'a pas été fait pour ça...

    Pour le this.mamethod c'est le piège ultra classique, il faudrait que je fasse un post sur le blog de SpringSource à ce sujet...

Discussions similaires

  1. Configuration Hibernate Spring et JTA
    Par totoranky dans le forum Hibernate
    Réponses: 3
    Dernier message: 28/08/2009, 17h03
  2. [Spring][Hibernate] Transaction déclarative
    Par mauvais_karma dans le forum Hibernate
    Réponses: 13
    Dernier message: 03/07/2008, 18h09
  3. [SPRING][HIBERNATE][MYSQL] insert et valeur des champs.
    Par nikalkal dans le forum Hibernate
    Réponses: 9
    Dernier message: 27/04/2006, 15h07
  4. Réponses: 2
    Dernier message: 16/02/2006, 10h04
  5. Réponses: 5
    Dernier message: 25/05/2005, 22h16

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