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.
Partager