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 :

Erreur ORA-00001 suite à PreparedStatement.executeBatch()


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 51
    Par défaut Erreur ORA-00001 suite à PreparedStatement.executeBatch()
    Bonjour,

    Je dispose de la 10g de Oracle XE. J'ai créé une table avec une clé primaire, que je veux remplir avec des données. Je ne sais pas si je vais recevoir ces données en doublons!! Toujours est-il que je ne veux pas de doublons dans ma table:
    1. Soit à la reception d'un doublon, je l'ignore
    2. Soit je l'écrase dans la table


    J'utilise un preparedStatement dont je remplis le batch jusqu'à un certain point (par exemple si j'ai reçu 50 enregistrements, je les enregistre dans la table de façon atomique).

    Le problème c'est que parmi ces 50 enregistrements, lorsqu'il y a des doublons deja dans la table, jdbc se fache et lève une exception de type BatchedException d'id ORA-00001 dûe à la violation de contrainte unique.
    Ce qui fait qu'aucun de mes 50 enregistrement n'est enregistré, puisque j'utilise ma connexion en setAutoCommit(false).

    J'aimerais savoir s'il existe une astuce comme avec MySQL qui permet d'ignorer l'insertion des doublons (Avec mySQl c'est INSERT IGNORE INTO TABLE ...).


    Je vous en remercie.

  2. #2
    Membre expérimenté Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Par défaut
    Je te conseille de trier to liste de données avant l'envoi a la DB, pour être sûr que ce que tu envoies est juste. En plus tu limiteras les accès DB ET le trafic réseau. En mode batch ces critères ne sont plus négligeables !
    Par exemple, tu peux créer une collection de type Set de PK, et vérifier si chaque PK existe dans la liste. Si oui tu ignores, si non tu le traites et tu rajoutes la PK dans le Set.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 51
    Par défaut
    Par ce fait, confirmeriez vous l'impossibilité pour la BD Oracle de faire ce travail tout seul? Dans ce cas, cette BD ne m'impressionnerait plus !! Pourrait faire mieux alors!

    Comme vous l'aviez souligné, cette exception serait très simple à gérer sans le mode Batch, mais hélas dans ce cas.

    Le problème dans ta solution est:

    QUE FAIRE SI CE LOGICIEL DOIT TOURNER PLUSIEURS JOURS DE FACON PERMANENTE? Surtout si la mémoire est pas énorme ! Ca coincerait je crois.

  4. #4
    Membre expérimenté Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Par défaut
    Pour ma part, faire un batch qui fonctionne plusieurs jours en continu semble bizarre !!!
    En ce qui concerne ma méthode, pour une même transaction, je vérifie si l'entrée existe ou pas. Si elle existe : UPDATE si nécessaire, sinon INSERT.
    J'utilise Hibernate pour le mapping O/R et une base Oracle 9.2.
    Dans chaque transaction je manipule 500 entrées (découpage en paquets).
    J'obtiens des perfs de 12000 entrées traitées par minute (5 ms en moyenne / entrée).
    Si ton batch tourne plusieurs jours, j'aimerais connaître ta volumétrie.

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Par défaut
    Citation Envoyé par TravelMate
    Le problème c'est que parmi ces 50 enregistrements, lorsqu'il y a des doublons deja dans la table, jdbc se fache et lève une exception de type BatchedException d'id ORA-00001 dûe à la violation de contrainte unique.
    Ce qui fait qu'aucun de mes 50 enregistrement n'est enregistré, puisque j'utilise ma connexion en setAutoCommit(false).
    Salut,

    pourquoi ne pas traiter tout simplement l'exception levée au niveau du "catch" de ton bloc try-catch d'insertion et ainsi passer à l'enregistrement suivant et faire le commit en fin de traitement.

Discussions similaires

  1. Erreur ORA-00918 suite à DECLARE_REWRITE_EQUIVALENCE
    Par chmanu dans le forum Administration
    Réponses: 2
    Dernier message: 09/07/2009, 15h47
  2. erreur ORA-01452 suite imp/exp
    Par Eric BERNARD dans le forum Import/Export
    Réponses: 1
    Dernier message: 13/02/2007, 10h28
  3. [10g] erreur ORA-01652 suite à INSERT-SELECT
    Par TG37140 dans le forum Administration
    Réponses: 5
    Dernier message: 18/12/2006, 19h45
  4. Erreur ORA-00001 lors d'un enregistrement
    Par gscorpio dans le forum Oracle
    Réponses: 4
    Dernier message: 11/12/2006, 13h09
  5. [Oracle] Erreur ORA-00900 suite à certaines requêtes
    Par osmoze dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 13/01/2006, 17h43

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