BatchUpdateException: le lot ne sera pas résiliée
J'ai une application qui traite un très gros fichier et envoie des données à une base de données oracle (à l'aide de la version 6 de Java, oracle 9).
Dans une boucle, j'utilise un PreparedStatement ps
et de créer toutes les instructions SQL générées avec ps.addBatch()
.
J'ai une situation où un BatchUpdateException bue
est jeté quelque part au cours de la ps.executeBatch()
. À ce stade, le lot s'arrête à être exécuté.
J'aimerais le lot exécution continue, de sorte que je peux alors vérifier les mises à jour défectueuses dans une méthode processUpdateCounts(bue.getUpdateCounts())
.
La javadoc de classe de BatchUpdateException dit:
Après une commande dans un lot de mise à jour
ne parvient pas à exécuter correctement et qu'une
BatchUpdateException est levée, l'
le pilote peut ou ne peut pas continuer à
le reste des commandes dans le
lot.
Est-il un moyen de faire respecter la poursuite ou dois-je modifier mon programme pour qu'il exécute l'instruction individuellement?
OriginalL'auteur faboolous | 2011-01-18
Vous devez vous connecter pour publier un commentaire.
Viens de trouver ce lien:
JDBC Lot Problème de mise à Jour
Apparemment, il a dit qu'il n'y a
je suis de recourir à l'envoi de l'insère un par un.
Merci
(désolé de ne pas à la recherche de mieux pour trouver le lien ci-dessus avant).
OriginalL'auteur faboolous
il y a une solution qui vous permettrait d'utiliser le lot de fonctionnalité. Au lieu d'exécuter une simple instruction INSERT, vous pouvez exécuter une PL/SQL bloc qui traitera de l'erreur d'une manière appropriée:
La performance devrait être sur pied d'égalité avec l'insertion de lot (devrait être plus rapide que l'exécution de la consolidés). Vous pouvez également appeler une procédure stockée à la place d'un PL/SQL bloc.
OriginalL'auteur Vincent Malgrat
Oracle lui-même peut, voir ici: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci04sql.htm#sthref616
Cependant, il ne semble pas que cette fonctionnalité est exposée à JDBC, pas même dans l'oracle de classes spécifiques.
En raison de la plutôt inutile JDBC erreur de manipulation ("le pilote peut ou ne peut pas continuer"), je suis toujours un point de sauvegarde avant de le lot, et l'exécution d'une restauration de ce point en cas d'erreur. C'est la seule JDBC conforme à établir un état connu après un Oracle Lot d'Erreur--pour autant que je sais.
OriginalL'auteur Markus Winand
Depuis la spécification ne semble pas mandat (comme le montre clairement par la Javadoc), toute "forcé" de la poursuite devra être faite par le pilote. Un simple conforme à la norme solution de contournement serait de vérifier la
getUpdateCounts()
tableau retourné et re-run", le lot de ces déclarations, qui avait échoué. Vous pouvez faire de cette démarche un peu plus sophistiqué en les mettant dans une logique pour le nombre de tentatives.Sûr, cela semble un peu brouillon (en gardant la trace de la "fournée", a ajouté, puis en cochant la sortie), mais serait de travailler à travers toutes les bases de données et les implémentations de pilote. Juste une pensée...
OriginalL'auteur Sanjay T. Sharma