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 / iBatis / outil externe] Récupérer la connexion de la transaction courante [Data]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Par défaut [Spring / iBatis / outil externe] Récupérer la connexion de la transaction courante
    Bonjour,

    J'utilise depuis très récemment Spring 2.0 et iBatis (avec AppFuse) et il se trouve que j'ai du mal à régler un problème de transaction non prise en compte.

    Dans un manager, donc une classe métier gérée par Spring, j'ai besoin de faire un traitement transactionnel, constitué de plusieurs opérations de mise à jour sur une base de données, ainsi qu'au milieu de celles-ci, un dump de ma base (postgres) dans un fichier, à l'aide de l'outil DdlUtils.

    En d'autres termes :

    1. Copie de données, incrémentation d'un compteur dans une table
    2. Dump des données dans un fichier (au format XML avec l'API DdlUtils mais peu importe)
    3. Nettoyage suppression des données dumpées...


    Il se trouve que mon fichier de dump doit contenir les données qui viennent d'être mises à jour juste avant. Or il s'avère que ce n'est pas le cas car l'outil DdlUtils, à qui ont doit fournir une datasource, effectue son dump, sans considérer la transaction courante. Donc, en fait, DdlUtils, en faisant un dataSource.getConnection(), ne récupère visiblement pas la connexion liée à la Transaction courante. Ainsi, j'obtiens un deadlock qui empèche d'exécuter le reste du traitement toujours sur la même base.

    J'ai tenté tout un tas de choses sans succès (TransactionAwareDataSourceProxy, wrapper un DataSource pour avoir la maîtrise de ce qu'il fournit à DdlUtils, modifier la déclaration du service pour que celui-ci soit soumis à mon Transaction manager...etc). J'imagine qu'il faut peut-être parvenir à récupérer la connexion courante sur laquelle la transaction est active mais je n'en suis pas certain et je ne sais comment faire.

    Comme mon expérience avec Spring est toute nouvelle et mes recherches ayant été relativement infructueuses, j'apprécierais qu'on m'explique comment aborder ce genre de problématique. Sur quels principes partir et quelles notions à bien avoir en tête.

    Je vous remercie par avance.

    A titre d'illustration, voici quelques éléments de mon implémentation courante :
    Ma Classe service :
    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
    public class MyManagerImpl extends BaseManager implements MyManager {
     ... 
            private DataSourceTransactionManager transactionManager; 
     ... 
            public DataSourceTransactionManager getTransactionManager() { 
                    return transactionManager; 
            } 
            public void setTransactionManager(DataSourceTransactionManager transactionManager) { 
                    this.transactionManager = transactionManager; 
            } 
    
            public String synchAndDumpDB(){ 
    
                    while(...) { 
                            .... 
                            quelques mises à jour / créations dans la bdd
                            ... 
                            // Dump de la base
                            ddltutils(transactionManager.getDataSource())
                            .... 
                            d'autres mises à jour / créations dans la bdd
                    } 
            } 
     .... 
     }

    applicationContext-ibatis.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
            <property name="dataSource" ref="dataSource" /> 
    </bean>

    applicationContext-service.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <bean id="myManager" class="com.myapp.MyManagerImpl"> 
            <property name="transactionManager"> 
                    <ref bean="transactionManager"/> 
            </property> 
            .... autres propriétés et déclaration DAO
    </bean>
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  2. #2
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Par défaut
    Petite question :

    Est-ce que par hasard vous pensez qu'avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Connection myConnection = DataSourceUtils.doGetConnection(dataSource);
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connection myConnection = dataSource.getConnection();
    je peux m'en sortir ?
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  3. #3
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Par défaut
    Bon apparemment, je parviens à m'en sortir avec DataSourceUtils mais c'est assez tordu ce que je suis obligé de faire...

    Il me semble que si les opérations JDBC faites dans l'outil externe DdlUtils-1.0.jar ne prennent pas en compte la connexion du contexte transactionnel, c'est tout simplement que ce jar n'est pas dans le scope de Spring. Me trompe-je ?

    Donc si je ne me trompe pas, il suffirait que je déclare le jar à un certain endroit de la config Spring, pour que les opérations sur la bdd soient "automatiquement transactionnelles". Si oui, quelqu'un peut-il m'orienter un peu car je n'ai pas franchement d'idée pour le moment ?
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

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

Discussions similaires

  1. Outil pour simuler des connexions pour application web
    Par lehic dans le forum Tests et Performance
    Réponses: 4
    Dernier message: 14/06/2006, 16h16
  2. [Outils][IIS] Probleme de connexion base de données
    Par Docteurfla dans le forum ASP.NET
    Réponses: 43
    Dernier message: 02/06/2006, 15h34
  3. récupérer login connexion et mot de passe
    Par zut94 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/01/2006, 15h02
  4. [Outils][IIS] Problème de connexion
    Par Remotche dans le forum IIS
    Réponses: 22
    Dernier message: 05/04/2005, 12h05
  5. workspace_loc, outils externes, Ant
    Par supbobo2004 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 28/06/2004, 17h49

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