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

Persistance des données Java Discussion :

iBatis/Eclipse - Rollback


Sujet :

Persistance des données Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 74
    Par défaut iBatis/Eclipse - Rollback
    Bonjour à tous,

    J'utilise actuellement Eclipse ainsi que la bibliothèque iBatis afin de lire un fichier SQL (script) directement depuis Eclipse. Mais je rencontre un problème. Je m'explique : je souhaiterais que, lorsque un script est mal éxecuté (pour n'importe quelle raison), on effectue un rollback afin de revenir en arrière, et ce sans toucher au fichier script, mais au code Java dans Eclipse.

    Or, lorsque j'exécute un rollback après l'exécution de mon script, rien ne ce passe, il ne revient pas en arrière. Je me demande si cette fonctionnalité est réalisable du fait que je passe par un fichier script et non par des requêtes à la main dans mon fichier Java :s ...

    Fichier Java utilisant iBatis :
    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
    String monScript = "script.sql";
     
    		try {
    			Class.forName("com.mysql.jdbc.Driver");
    			Connection cn = DriverManager.getConnection("jdbc:mysql://localhost/ahiweb", "root", "root");
     
    			Statement st = null;
     
    			ScriptRunner sr = new ScriptRunner(cn);
    			Reader r = new BufferedReader(
    					new FileReader(monScript)); //fichier placer à la racine du proget
    			sr.runScript(r);
    			cn.rollback(); //rien ne ce passe ici
     
     
    		}
    Fichier sql :

    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
    START TRANSACTION;
     
    INSERT into ahiweb.utilisateur VALUES ('955', '55', '117', 'Tata', 'Titi', 'toto', 'toto', '2', '1', 'toto@gmail.com', '1', '0656565656', '2012-01-02 00:00:00', '2012-01-02 00:00:00', '', '2012-01-02 00:00:00', '2012-01-02 00:00:00', '0', '0', '0', '0', '0' );
    INSERT into ahiweb.utilisateur VALUES ('956', '55', '117', 'Tutu', 'Titi', 'toto', 'toto', '2', '1', 'toto@gmail.com', '1', '0656565656', '2012-01-02 00:00:00', '2012-01-02 00:00:00', '', '2012-01-02 00:00:00', '2012-01-02 00:00:00', '0', '0', '0', '0', '0' );
     
    CREATE TABLE `ahiweb`.`tabletest` (
      `idtabletest` INT NOT NULL AUTO_INCREMENT COMMENT '',
      `nomtabletest` VARCHAR(45) NULL COMMENT '',
      `numerotabletest` INT NULL COMMENT '',
      `villetabletest` INT(10) UNSIGNED NULL COMMENT '',
      PRIMARY KEY (`idtabletest`)  COMMENT '',
      INDEX `FKTest_idx` (`villetabletest` ASC)  COMMENT '',
      CONSTRAINT `FKTest`
        FOREIGN KEY (`villetabletest`)
        REFERENCES `ahiweb`.`adr` (`id`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION);

  2. #2
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Tu as un create table dans ton script : ça provoque un commit automatique de ce qu'il y a avant.

    Ne jamais mélanger DML (data manipulation language : select, insert, etc..) et DDL (data definition language : create table...)


    Accessoirement, un objet Connection est toujours en mode autocommit par défaut, mais ça devrait te renvoyer une exception si tu fais un rollback dessus

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 74
    Par défaut
    Bonjour eulbobo et merci de me répondre,

    En effet j'ai un create table, mais même si je l’enlève, cela ne fonctionne pas, rien ne se passe..

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 74
    Par défaut
    Bonjour joel.drigo,

    je viens d’essayer avec ta ligne de code en plus mais ça ne change rien

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Sous mySql (cf), comme la dit @eullbobo, le create table fait un commit implicite (on peut faire des transactions pour pouvoir faire un rollback sur du DDL sur d'autres SGBD).

    Si tu veux tester que ça fait bien un rollback, retire le create table (ou modifie le pour qu'il provoque une erreur, et fait le rollback dans le catch).

    [EDIT]Après il faudrait regarder ce que fait ScriptRunner à ce propos (je ne connais pas du tout iBastis, je ne peux pas dire)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 74
    Par défaut
    Le retirer j'ai essayer, et rien ne change Je vais essayer de faire le rollback dans le catch pour voir ...

    [EDIT] Quelle exception par exemple? car par défaut c'est la noClassFound exeption ^^

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    [EDIT]Après il faudrait regarder ce que fait ScriptRunner à ce propos (je ne connais pas du tout iBastis, je ne peux pas dire)
    A regarder le source du ScriptRunner, Commit et Rollback sont déjà gérés en interne, si la connexion est "autocommit=false".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!connection.getAutoCommit()) {
            connection.commit();
          }
    Donc, tant qu'il n'y a pas d'exception, les ordres seront commités.

    A noter également, qu'il y a un paramètre pour exécuter "ligne par ligne", ou d'un bloc, et que ce paramètre fait que ça exécute ligne par ligne par défaut (avec un commit forcé après chaque ligne=chaque ordre SQL). Il faut que tu changes ce mode de fonctionnement (setSendFullScript(true)).

    Pour ta question sur "quelle exception", les exceptions SQL (checked) sont encapsulées dans une unchecked-exception (RuntimeSQLException).
    Tu peux modifier par exemple le second insert (mettre une erreur de syntaxe SQL volontairement), et normalement ça fera le rollback.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par javadoc
    public interface Connection
    extends Wrapper, AutoCloseable
    [...]
    Note: When configuring a Connection, JDBC applications should use the appropriate Connection method such as setAutoCommit or setTransactionIsolation. Applications should not invoke SQL commands directly to change the connection's configuration when there is a JDBC method available. By default a Connection object is in auto-commit mode, which means that it automatically commits changes after executing each statement. If auto-commit mode has been disabled, the method commit must be called explicitly in order to commit changes; otherwise, database changes will not be saved.
    [...]
    Pour changer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cn.setAutoCommit(false);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Eclipse en français
    Par Super Castor dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 02/06/2007, 15h59
  2. Eclipse Mac version et pluginUML
    Par Driden dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 09/06/2003, 19h03
  3. commit et rollback....?
    Par The_Nail dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/06/2003, 14h36
  4. [VB6]ADODB Command, recuperer l'info d'un RollBack
    Par Mouse dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/05/2003, 16h26
  5. Servlet dans Eclipse ?
    Par unflag dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/04/2003, 18h46

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