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 :

Connection et multi-thread


Sujet :

JDBC Java

Vue hybride

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Par défaut Connection et multi-thread
    Bonjour,

    j'ai écrit un programme censé charger des données en base de données Oracle 10.

    Afin de gagner du temps, le programme est fait de telle manière qu'un lecteur lit toutes les lignes des fichiers en entrée (il peut y en avoir une infinité), et les donne à manger par paquet de 5000 lignes aux threads d'écritures qui patientent sagement jusqu'à ce qu'un paquet arrive.

    Une fois un paquet arrivé, le thread l'insère en base via sa propre connection jdbc obtenue lors de son instanciation.


    Le problème : ces lignes insérées doivent avoir une clé primaire unique. Le problème est résolu en passant par une méthode synchronized getId() que tous les threads appellent pour pouvoir valoriser la clé primaire de chaque ligne insérée.

    Dans les logs, on voit clairement que la méthode remplit son rôle, et correctement.

    Sauf qu'en pratique, Oracle me jette au bout d'un temps variable avec un merveilleux
    ORA-00001: violation de contrainte unique (TEST.TEST_949718290)

    Si j'utilise le même objet Connection pour tous mes threads, ca marche. Mais si chaque thread utilise sa propre connection, ca ne marche plus.

    Je n'y comprend rien, quand le thread meurt à cause de l'erreur, je fais afficher la clé primaire fautive, la connexion utilisée, etc, et il est évident que la clé n'est ni en base, ni générée précédemment par la méthode synchronized, ni manipulée par aucun un autre thread.

    D'où ma question à deux millions d'euros : pourquoi cette fichue exception est-elle lancée par Oracle ? J'ai essayé avec ojdbc14, ojdbc5, et ojdbc6 et c'est le même résultat...

    Merci pour vos pistes.

  2. #2
    Membre émérite Avatar de noOneIsInnocent
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 037
    Par défaut
    Bonjour

    Est-ce que tu peux poster ton code de la méthode getID et des threads qui l'appellent ?

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    et vérifiez aussi que la contrainte TEST.TEST_949718290 est bien celle qui est liée à cet id

    Ceci dit, a moins que vous ayez un besoin absolu de controller la clé primaire pour une raison quelconque, le plus simple est de ne pas la fournir à la requet oracle et d'associé à la colonne un trigger qui utilisera un séquence pour la générer

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. [C++][serveur multi-threads] prob de connection
    Par Just_the_boss dans le forum C++
    Réponses: 4
    Dernier message: 23/02/2006, 19h09
  3. Réponses: 16
    Dernier message: 30/01/2004, 11h05
  4. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01
  5. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09

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