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 :

Thread et transaction [Framework]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Par défaut Thread et transaction
    Bonjour,

    je suis en train de bosser sur une application basée sur Spring 3 (avec annotations) + Hibernate + couche Web.

    Je gère les transaction avec un openSessionInView pour la couche Web, des @Transactional pour la couche service.

    Il se trouve que dans la couche Web je suis obligé de lancer un thread qui génère des rapports.

    Malencontreusement, dans ce thread j'ai besoin d'accéder à des objets de ma couche de service. Comment je peux définir un contexte de transaction sur ce thread histoire d'éviter des "LazyInitializationException no session or session was closed" ?

    j'ai bien essayé de rajouter un @Transactional comme ça :

    new Thread() {
    @Override
    @Transactional
    public void run() {
    Mais sans succès

    Si quelqu'un a une idée, je suis preneur, merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Dans la déclaration des transactions par annotations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <tx:annotation-driven  />
    tu précises l'attribut 'mode' ?
    Par défaut, c'est proxy et c'est ce que la plupart des config utilisent.

    En mode proxy, une méthode annotée @Transactional est interceptée uniquement pour les appels passant par le proxy qui a été généré pour rendre transactionnelle la méthode annotée.
    Si tu appelles une méthode annotée @Transactional depuis la classe originale (la cible du proxy), ca n'a aucun effet puisque tu passes pas par le proxy.

    Mes suggestions si tu veux tjrs passer par des @Transactional :

    1.Contournement simple

    Si la méthode englobante qui crée le thread est une méthode d'un bean Spring appelée depuis une classe extérieure, pourquoi ne pas simplement annoter la méthode @Transactional ?

    2.Contournement un peu lourd

    Si tu tiens à conserver l'annotation @Transactional pour l' exécution du thread, tu peux créer un bean tout con avec une méthode doProcess() annotée @Transactional .
    Tout le traitement dans la méthode run() du thread sera déplacé dans la méthode doProcess() du bean en question et le run() ne ferait qu'appeler doProcess() (donc de l'extérieur) de ce nouveau bean qu'il aura en dépendance.

    Perso, je trouve la solution pas très propre : on créé une nouvelle classe uniquement pour répondre à une carence des outils (Spring en l'occurrence) ou de conception plus généralement.

    3. Pas mal si ca marche
    La doc Spring explique que le mode 'aspectj'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <tx:annotation-driven  mode="aspectj"/>
    permet d'éliminer la limitation des annotations @Transactional sur les méthodes appelées depuis un même bean .

    Perso, j'ai jamais essayé la dernière solution.
    Si ca marche, n'hésite pas à faire un retour

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Par défaut
    Bonjour et merci pour tous ces éléments.

    Je viens de tester la méthode 3) mais je n'ai effectivement pas de résultat probant.

    Il faut que je fouille un peu plus, je regarde et je vous tiens au courant.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 6
    Par défaut
    Bon au final, j'ai collé un service géré par spring dans mon thread. Ce service étant déclaré @transactional, j'ai réussi à élminier tous mes petits soucis.

    Merci

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Je t'en prie, ca me fait réviser Spring

    Arf pour la solution 3
    J'ai essayé par curiosité hier soir et j'ai pas réussi non plus

    T'entends quoi par "collé un service" ? Méthode 2 on dirait

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

Discussions similaires

  1. Problème transaction et thread
    Par valoji dans le forum Bases de données
    Réponses: 9
    Dernier message: 27/10/2008, 16h19
  2. [Data] Spring, transactions et threads
    Par cecile_31 dans le forum Spring
    Réponses: 8
    Dernier message: 16/07/2008, 13h47
  3. [SQLITE][TRANSACTION] transaction répartie entre threads
    Par nannous dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 16/11/2006, 10h24
  4. [SQLITE]transaction répartie entre threads
    Par nannous dans le forum SQLite
    Réponses: 2
    Dernier message: 15/11/2006, 14h12
  5. Interbase, threads et transactions
    Par Reisubar dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/07/2004, 17h55

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