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

JDBC Java Discussion :

PreparedStatement continue a insérer si Error


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 25
    Points : 16
    Points
    16
    Par défaut PreparedStatement continue a insérer si Error
    Bonjour

    J'ai un petit souci avec Objet PreparedStatement en java pour insérer dans une base de donnée Oracle.

    Enfaite je Prépare bien la model de ma requête INSERT dans le PreparedStatement j'ajoute bien tous mes paramètres avec un addBatch() pour chaque record je veux insérer .

    j'ajoute plusieurs batchs pour Insérer d'un coups 500 records par exemple .

    Jusque là tous marche bien j'arrive a insérer ce que je veux

    Par contre dans le cas ou mon PreparedStatement génère une erreur BatchUpdateException (par exemple violation de contrainte) sur les 500 ligne que je veux insérer il m'insert rien du tout.

    Moi je veux a la limite retirer le record qui pose souci(avec violation contrainte) et insérer au moins les 499 ligne qui sont OK

    Je peu faire cela comment svp ? si qu'elle qu'un peu me donner une piste je serais reconnaissant.


    Juste pour Info je veux bien insérer plusieurs lignes d'un coups a partir de 500 lignes, donc la solution d'insérer ligne par ligne ça m'arrange pas trop niveau performance
    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    La méthode getUpdateCounts() de BatchUpdateException t'indique le résultat de chaque requête.
    Tu devrais pouvoir récupérer la (ou les) requête(s) fautives avec cela...


    a++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    La méthode getUpdateCounts() de BatchUpdateException t'indique le résultat de chaque requête.
    Tu devrais pouvoir récupérer la (ou les) requête(s) fautives avec cela...


    a++

    Bonjour adiGuba
    Merci pour ta réponse et désolé pour ma réponse tardive
    Enfaite je ne vois pas vraiment comment je peu utiliser cette méthode dans mon cas (Pour retirer la requête fautives)
    Exemple avec mon PrépareStatment je veux exécuter 10 requêtes et les 2 premières requête pose problème
    donc je vais avoir une exception BatchUpdateException et la méthode getUpdateCounts() va me retourner un tableau avec une seule ligne [0] = -2
    pour me dire que la 1ere requête ne passe pas
    Donc --> Déjà exécution s'arrête a la 1ere requête qui pose problème et en plus elle va pas continuer a exécuter les 8 autres requêtes qui sont OK !!!
    je ne sais pas si c'est plus clair avec mon exemple
    Cordialement

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Ben si tu arrives à déterminer la requête qui ne passe pas, tu peux régénérer tes batch en ignorant les requêtes déjà passé ou en erreur.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ben si tu arrives à déterminer la requête qui ne passe pas, tu peux régénérer tes batch en ignorant les requêtes déjà passé ou en erreur.
    Ok donc y a pas moyen de dire je retire juste le batch qui pose souci et je continue exécution (genre deleteBatch(1)) c'est dommage de tout reconstruire je trouve, mais bon je vais me débrouiller.

    En tous les cas j'ai remarqué si j'ai un PrépareStatement avec 500 Ligne a insérer et que c juste la dernière ligne qui pose problème il va insérer aucune ligne donc je suis obligé de détecté que c'est bien la dernière ligne qui pose pb et régénérer les 499 batch (reconstruire tout mon PrépareStatment) on est bien d'accord que c'est comme ça qu'il faut faire si j'ai bien compris ??

    Merci a toi.

    Cordialement,

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Non si la dernière requête plante il t'aura inséré les 499 première, et getUpdateCounts() te retournera un tableau de 500 int.
    A partir de là tu peux connaitre l'état de chaque requête et donc savoir celle qui sont passé ou pas.

    Après la gestion dépend des drivers JDBC.
    Certains s'arrêtent à la première erreur et n’exécutent pas les suivante, tandis que d'autre vont tout exécuter et remonter l'exception si une ligne a échoué...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 25
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Non si la dernière requête plante il t'aura inséré les 499 première, et getUpdateCounts() te retournera un tableau de 500 int.
    A partir de là tu peux connaitre l'état de chaque requête et donc savoir celle qui sont passé ou pas.

    Après la gestion dépend des drivers JDBC.
    Certains s'arrêtent à la première erreur et n’exécutent pas les suivante, tandis que d'autre vont tout exécuter et remonter l'exception si une ligne a échoué...
    Ahhh je comprend mieux donc ça dépend du Drivers JDBC alors.
    donc je pense dans mon cas mon driver se plante effectivement à la première erreur et n'exécute pas les suivantes (mais j'ai remarqué que quand il génère une erreur même les requêtes qui ont été exécutées avant échec ne sont pas comités j'ai impression qu'il commit a la fin si seulement il a bien tout exécuté)

    Mais comment je fait la différence entre les drivers JDBC ? est ce que ta un lien stp pour télécharger un driver JDBC .jar qui justement permet d'exécuter tout et remonter l'exception a la fin ?

    Cordialement

  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
    Je dirais que c'est une question de gestion de transactions.
    Soit tu fais une transaction par requête: pas très performant mais si une requête plante, elle n'empêche pas la bonne exécution des autres.
    Soit tu fais une transaction pour plusieurs requêtes comme actuellement: dans ce cas, comme le dit adiGuba, il te faudra gérer toi même les erreurs et relancer ton batch.
    C'est tout l'intérêt des transactions, on valide un ensemble de requêtes ou rien, pour éviter les incohérences.

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

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Le driver JDBC ne changera rien, c'est son fonctionnement normal

    Le fonctionnement du batchUpdate est de préparer un ensemble d'ordres SQL à envoyer en une seule fois dans une même transaction.
    Si un seul plante, c'est normal qu'il y ait un rollback pour l'ensemble du paquet de données.




    Une solution serait d'utiliser le même fonctionnement que Spring Batch pour ça (qui est une implémentation de l'API batch : http://www.oracle.com/technetwork/ar...h-1965499.html )

    Tu fais tes mises à jour par paquets (500 par 500) (comme actuellement)
    Si tout se passe bien pour un paquet, tant mieux
    Si ton paquet plante, tu rééxécutes chaque requête du paquet de données à mettre à jour individuellement.

    ==> les paquets qui passent continuent d'être traités par lot
    ==> les paquets avec des données en erreur ont leur éléments rejoués un par un



    Après, j'aurais aussi tendance à dire que tu devrais vérifier les contraintes d'intégrité en amont : une erreur BDD de ce type devrait toujours être considérée comme un bug et pas comme une façon de se dire "ha c'est déjà à jour"
    Je ne suis pas mort, j'ai du travail !

Discussions similaires

  1. [2012] [Résolut] Bulk insert continue with error ?
    Par Tophux dans le forum Développement
    Réponses: 2
    Dernier message: 08/03/2013, 11h30
  2. [AC-2007] insérer un formulaire continu dans un autre
    Par stagiaire88 dans le forum IHM
    Réponses: 6
    Dernier message: 28/07/2011, 13h59
  3. Réponses: 0
    Dernier message: 10/06/2011, 16h32
  4. [c#][VS 2008] there were deployement errors. Continue?
    Par Husqvarna dans le forum ASP.NET
    Réponses: 2
    Dernier message: 19/12/2007, 09h41
  5. Réponses: 4
    Dernier message: 15/06/2007, 10h04

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